coolycow / laravel-sms
Laravel-пакет для отправки SMS через подключаемые провайдеры
v2.0.0
2026-07-25 09:15 UTC
Requires
- php: ^8.2|^8.3|^8.4|^8.5
- illuminate/contracts: ^12.0|^13.0
- illuminate/database: ^12.0|^13.0
- illuminate/notifications: ^12.0|^13.0
- illuminate/support: ^12.0|^13.0
Requires (Dev)
- laravel/pint: ^1.18
- orchestra/testbench: ^10.0|^11.0
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^11.0|^12.0
README
Laravel-пакет для отправки SMS через подключаемые провайдеры. Конкретные реализации шлюзов живут в конечном приложении; этот пакет даёт клиент, модель хранения, конфиг, фасад и канал уведомлений.
Требования: PHP 8.2+ и Laravel 12 / 13.
Установка
composer require coolycow/laravel-sms
Опубликуйте конфиг и миграции:
php artisan vendor:publish --tag=sms-config php artisan vendor:publish --tag=sms-migrations php artisan migrate
Настройка
config/sms.php:
return [ 'enabled' => env('SMS_ENABLED', false), 'sender' => env('SMS_SENDER', 'Sender'), 'prefix' => env('SMS_PREFIX', ''), 'normal_balance' => env('SMS_NORMAL_BALANCE', 5000), 'minimal_balance' => env('SMS_MINIMAL_BALANCE', 300), 'default_provider' => env('SMS_PROVIDER', 'prosto'), 'providers' => [ 'prosto' => App\Sms\Providers\ProstoProvider::class, ], ];
Реализация провайдера
<?php namespace App\Sms\Providers; use Coolycow\LaravelSms\Contracts\SmsProviderInterface; use Coolycow\LaravelSms\DTO\SmsDTO; use Coolycow\LaravelSms\Enum\SmsStatusEnum; class ProstoProvider implements SmsProviderInterface { public function sendSms(SmsDTO $dto): array { // Вызов SMS-шлюза; верните структурированный массив ответа. return []; } public function getStatus(int $id): array { return []; } public function getErrorCodeFromResponse(array $response): int { return (int) ($response['error'] ?? self::RESPONSE_ERROR_CODE); } public function getErrorTextFromResponse(array $response): string { return (string) ($response['error_text'] ?? self::RESPONSE_ERROR_TEXT); } public function getStatusFromSendResponse(array $response): SmsStatusEnum { return SmsStatusEnum::RESPONSE_ERROR; } public function getProviderIdFromResponse(array $response): ?int { return isset($response['id']) ? (int) $response['id'] : null; } public function getStatusFromStatusResponse(array $response): SmsStatusEnum { return SmsStatusEnum::UNKNOWN_STATUS; } public function getBalance(): float { return 0.0; } public function getProviderName(): string { return 'Prosto SMS'; } public function getProviderCode(): string { return 'prosto'; } public function getPaymentUrl(): string { return 'https://example.com'; } }
Использование
use Coolycow\LaravelSms\Facades\Sms; use Coolycow\LaravelSms\Contracts\SmsClientInterface; // Фасад $message = Sms::send('79991234567', 'Ваш код: 1234'); // Контейнер $message = app(SmsClientInterface::class)->send('79991234567', 'Привет');
Если sms.enabled равен false, сообщения сохраняются со статусом disabled
и не отправляются провайдеру.
Laravel Notifications
use Illuminate\Notifications\Notification; class OtpNotification extends Notification { public function via(object $notifiable): array { return ['sms']; } public function toSms(object $notifiable): array { return [ 'text' => 'Ваш код: 1234', 'params' => ['type' => 'otp'], ]; } }
Номер телефона берётся из routeNotificationForSms() у notifiable, либо из
атрибута phone, либо из ключа phone в ответе toSms().
Разработка
composer install
composer test
composer analyse
composer lint
Лицензия
MIT