تجربه من از ساخت ماژول پیامک برای ملی پیامک در لاراول

تجربه من از ساخت ماژول پیامک برای ملی پیامک در لاراول
یکی از چیزایی که همیشه موقع پروژه‌های لاراولی باهاش درگیر بودم، ارسال پیامک بود 😅 مخصوصاً وقتی می‌خواستم برای سایت‌هایی که خودشون پنل پیامکی دارن (مثل ملی پیامک) یه ماژول تمیز و قابل استفاده بنویسم که راحت بشه توی کل پروژه ازش استفاده کرد. چند روز پیش نشستم و بالاخره ماژول اختصاصی خودم رو برای ملی پیامک ساختم، اونم بدون هیچ پکیج اضافی از گیت‌هاب. خواستم تجربه‌شو اینجا بنویسم شاید برای شما هم مفید باشه 🙌

🎯 ایده کلی

ملی پیامک یه API مبتنی بر SOAP داره (بله همون فناوری قدیمی اما هنوز کار می‌کنه 😅). کد ساده‌ش به این شکله:

ini_set("soap.wsdl_cache_enabled","0");
$sms = new SoapClient("http://api.payamak-panel.com/post/Send.asmx?wsdl", array("encoding"=>"UTF-8"));
$data = array(
    "username"=>"",
    "password"=>"",
    "text"=>"@bodyId@arg1;arg2;arg3",
    "to"=>""
);
$send_Result = $sms->SendByBaseNumber3($data)->SendByBaseNumber3Result;
echo $send_Result;
کد خوبیه برای تست اولیه، ولی واقعاً مناسب پروژه‌های واقعی نیست. من خواستم اونو به یه ماژول لاراولی تبدیل کنم که تو کل پروژه با یه سینتکس ساده بشه استفاده کرد 👇

Sms::to('09123456789')->pattern('verify_code')->send(['1234']);

⚙️ قدم اول: ساخت ساختار ماژول

من داخل پوشه app/Modules/Sms یه ساختار تمیز ساختم:

app/
 └── Modules/
     └── Sms/
         ├── SmsManager.php
         ├── SmsServiceProvider.php
         └── Facades/
             └── Sms.php
اینجوری ماژولم جدا از بقیه‌ی کدهای پروژه‌ست و راحت می‌تونم روش توسعه بدم.

💡 SmsManager — قلب ماژول

داخل فایل SmsManager.php، یه کلاس ساده نوشتم که کارش فقط ارتباط با وب‌سرویس ملی پیامک بود:

<?php

namespace App\Modules\Sms;

use SoapClient;
use Exception;

class SmsManager
{
    protected string $username;
    protected string $password;
    protected ?string $to = null;
    protected ?string $pattern = null;

    public function __construct()
    {
        $this->username = config('sms.username');
        $this->password = config('sms.password');
    }

    public function to(string $phone): self
    {
        $this->to = $phone;
        return $this;
    }

    public function pattern(string $pattern): self
    {
        $this->pattern = $pattern;
        return $this;
    }

    public function send(array $args = []): mixed
    {
        ini_set("soap.wsdl_cache_enabled", "0");

        try {
            $client = new SoapClient("http://api.payamak-panel.com/post/Send.asmx?wsdl", [
                "encoding" => "UTF-8",
            ]);

            $text = "@{$this->pattern}@" . implode(';', $args);

            $data = [
                "username" => $this->username,
                "password" => $this->password,
                "text"     => $text,
                "to"       => $this->to,
            ];

            return $client->SendByBaseNumber3($data)->SendByBaseNumber3Result;

        } catch (Exception $e) {
            report($e);
            return false;
        }
    }
}

🧱 تعریف تنظیمات در config

توی فایل config/sms.php تنظیمات اتصال رو اضافه کردم:

return [
    'username' => env('SMS_USERNAME'),
    'password' => env('SMS_PASSWORD'),
];
و در فایل .env هم نوشتم:

SMS_USERNAME=your_username
SMS_PASSWORD=your_password

🧩 مرحله نهایی: ساخت Facade


namespace App\Modules\Sms\Facades;

use Illuminate\Support\Facades\Facade;

class Sms extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'Sms';
    }
}
و توی سرویس‌پراوایدر ثبتش کردم:

namespace App\Modules\Sms;

use Illuminate\Support\ServiceProvider;

class SmsServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('Sms', function () {
            return new SmsManager();
        });
    }
}

🚀 حالا استفاده ازش مثل آب خوردن شد:


Sms::to('09123456789')->pattern('verify_code')->send(['1234']);
حتی می‌تونی اینو با Queue یا Notification هم ترکیب کنی و یه ماژول کامل حرفه‌ای بسازی.

✍️ جمع‌بندی تجربه

  • لازم نیست همیشه از پکیج‌های آماده استفاده کنیم
  • SOAP هرچند قدیمی‌ه، ولی با یه بسته‌بندی تمیز قابل استفاده‌ست
  • ماژولار کردن بخش پیامک باعث تمیزی و نگهداری راحت‌تر پروژه می‌شه
💬 اگه شما هم تجربه‌ی خاصی از پیاده‌سازی پیامک با ملی پیامک یا سرویس‌های دیگه دارید، توی کامنت‌ها بنویسید! من خودم نسخه‌ی بعدی این ماژول رو با Queue و ثبت لاگ پیامک‌ها در دیتابیس توسعه دادم که توی پست بعدی حتماً درباره‌ش می‌نویسم 😉
۷۳ بازدید ۲ پسندیدن
تماس مستقیم با من