Реализация фасада перед классом Factory Laravel 5.4

В некотором контексте – ранее сегодня я изо всех сил пытался выяснить, как реализовать фасад, похожий на Cache, – где я мог бы установить поставщика (например, disk ()), но также иметь родового провайдера возврата, когда он не предоставляется.

Теперь у меня есть базовая инфраструктура, но я считаю, что моя реализация противна. При вызове default () или provider () просто воняет. Тем не менее, есть понятие или что-то, что мне не хватает, чтобы заполнить пробелы здесь.

Реализация аналогичных функций для Cache :: disk ('x') в Laravel

Вот что я сделал.

// Factories\SMSFactory.php namespace App\Factories; use App\IError; class SMSFactory { public static function default() { $defaultProvider = config('sms.default_provider'); return self::provider($defaultProvider); } public static function provider($providerId) { $providerClass = config('sms.' . $providerId); if (class_exists($providerClass)) { return (new $providerClass); } return new class implements IError { }; } } // sms.php (config) return [ /** * Set the default SMS provider for the application */ 'default_provider' => 'smsglobal', /** * Map the SMS provider to a class implementation */ 'smsglobal' => 'App\SMSGlobal\SMSGlobal', ]; // Providers\SMSServiceProvider.php namespace App\Providers; use Illuminate\Support\ServiceProvider; class SMSServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { // } /** * Register the application services. * * * @return void */ public function register() { $this->app->bind('sms', 'App\Factories\SMSFactory'); } } // Facades\SMS.php namespace App\Facades; use Illuminate\Support\Facades\Facade; class SMS extends Facade { protected static function getFacadeAccessor() { return 'sms'; } } // app.php App\Providers\SMSServiceProvider::class, # and in aliases 'SMS' => App\Facades\SMS::class, // Controllers/TestController.php namespace App\Http\Controllers\TestController; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Facades\SMS; class TestController extends Controller { public function sendSMS($destination, $message) { $data = $request->all(); return SMS::default()->send([ 'destination' => $destination, 'message' => $message, ]); } } 

Меня действительно беспокоит необходимость всегда использовать default () …

Я понимаю, что фасад действует как статический класс, но можно ли настроить его таким образом, чтобы я мог делать такие звонки?

 SMS::send($args); // When I want to use another gateway SMS::provider('nexmo')->send($args);