~PHPLaravelデザインパターンデザインパターンデザインパターンは、いろんな文脈で使われるが、ここでのデザインパターンはGoFのデザインパターン。Patternでの実装箇所を取り上げる。舞いのうちの生成に分類される。生成過程を抽象化したり、コンストラクタの引数が多いとか複雑なときに使うデザインパターン。Patternを簡単に利用するための抽象クラス。インスタンス生成過程を隠蔽し、シンプルに再利用するために継承して使用することができる。Auth等で使用されていて、Authの認証方式やSessionのストレージをLaravelで初期状態で使用できるもの以外を使いたい場合は、自前ですべて作成するのではなく、Manageクラスに従って拡張すれば、Laravelの機能をできるだけ残したまま拡張できる。configの変更等最小のステップでほぼコードを書くことなく、設定を変更してSessionを別プロジェクトでも再利用が簡単にできる。機能拡張の際、Managerクラスを継承あるいは引用しているクラスをLaravelが使用している場合、これに乗っかって拡張するのが楽。新規機能を作る時も、Managerクラスを使えば、Driverを使ったBuilderパターンを容易に使用できる。最近はLaravelのManagerコンポーネント(AuthManager等)は、継承せずに実装されるように変更されている(処理自体は踏襲されている)。現在継承して使用されているのはSessionManagerなのでSessionManagerを使用して説明する。SessionManagerSessionで使用する機能(Illuminate\Session\Store)を再利用しつつ、使用者は保存先のストレージをconfigを使用して簡単に変更し、Session用のオブジェクト(Illuminate\Session\Store)を生成できるようにというのが、SessionManagerの趣旨Sessionのストレージの選択肢は、ほぼ確定しているのでそのストレージごとに生成過程を見やすく管理できる。});}SessionServiceProviderでSessionManagerがコンテナに登録されているSessionManagerは、あくまで生成過程を抽象化してくれているもので、最終的にはIlluminate\Session\Storeのインスタンスが帰ってくる。ここで/config/session.phpのdriverをDriverとしてセットしている。$this->app['config']['session.driver'];}生成過程で必要になる要素を、Driverとして登録する。ここではSessionを保存するためのStorageをDriverとして登録しておく。File、memcached、Redis、Dynamoとかいくつか用意されている。callCustomCreatorで独自のDriverを登録できるはず(試したことない)各Driverメソッド内で生成過程の差異を吸収する。Sessionに別のストレージを使いたい場合この仕組みを利用するとLaravelの仕様に乗っかれて便利。configでSessionを設定できるように、$this->app['config']を使用してStoreの生成を抽象化している。'create'.Str::studly($driver).'Driver';のところでDriverメソッドを確定している。SessionManagerの効果SessionManagerにより、SessionのストレージをDATABASEにしたい場合、下記を設定するだけで、SessionファサードでDatabaseストレージに対応したStoreインスタンスが取得できるようになる。migrateSession処理Session::all();Session::get('hoge');SMS用のManagerクラスを作ってみるSmsは外部サービスに処理を投げるので、Driverとして使用するSmsサービスを定義しておく。今回は、NexmoとTwilioのDriverメソッドを定義する。このメソッドからSms送信用のDriverクラスを定義しておく。SmsManagerが返すインスタンスは、Driverクラス。}}createClientで、SMSのapiの初期化をして各DriverClassに渡す。App\Components\Sms\Drivers\Driver各外部サービスのDriverクラスの抽象クラス、共通の設定処理を抽象化しておく。メソッドチェーンしたいので$thisを返しておく。->send();channelメソッドでDriver(TwilioかNexmo)を指定して、各種設定をしてメッセージを送信できて便利。upLoginユーザーは見つかりませんでした。