0

いくつかのコンテキストについて-今日の初めに、キャッシュに似たファサードを実装する方法を理解するのに苦労していました-プロバイダー(disk()など)を設定できますが、提供されていない場合は一般的なフォールバックプロバイダーも使用できます。

これで、基本的なインフラストラクチャが機能するようになりましたが、私の実装は厄介だと思います。default() または provider() を呼び出すだけで悪臭を放ちます。ただし、ここでのギャップを埋めるために欠けている概念または何かがあります。

Laravel で Cache::disk('x') と同様の機能を実装する

これが私がやったことです。

// 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);
4

1 に答える 1