تجربه من از ساخت ماژول پیامک برای ملی پیامک در لاراول
•
یکی از چیزایی که همیشه موقع پروژههای لاراولی باهاش درگیر بودم، ارسال پیامک بود 😅
مخصوصاً وقتی میخواستم برای سایتهایی که خودشون پنل پیامکی دارن (مثل ملی پیامک) یه ماژول تمیز و قابل استفاده بنویسم که راحت بشه توی کل پروژه ازش استفاده کرد.
چند روز پیش نشستم و بالاخره ماژول اختصاصی خودم رو برای ملی پیامک ساختم، اونم بدون هیچ پکیج اضافی از گیتهاب.
خواستم تجربهشو اینجا بنویسم شاید برای شما هم مفید باشه 🙌
🎯 ایده کلی
ملی پیامک یه 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 هرچند قدیمیه، ولی با یه بستهبندی تمیز قابل استفادهست
- ماژولار کردن بخش پیامک باعث تمیزی و نگهداری راحتتر پروژه میشه
۷۳ بازدید
•
۲ پسندیدن