LaravelのInputとFacade(ファサード)
次はリクエストと入力について書こうかと思っていたところ、ドキュメントと同じ内容しか書けなさそうなのでInputクラスの中身を読んでみることにしました。
vendor\laravel\framework\src\Illuminate\Support\Facades\Input.php
ただ、InputクラスはFacadeクラスを継承していて、getFacadeAccessor()という謎のメソッドが定義されていることはわかります。
FacadeといえばGoFのデザインパターンにあるFacade(ファサード)ですね。 サブシステムに仕事を投げるメソッドを提供するクラスを作り、サブシステムの独立性を高めるためのパターンです。
今回は、Input::allを例に取り、LaravelのFacadeの動作を見ていきます。
つまりInput::allやInput::onlyは実はRequestクラスのメソッドとして実行されていたのです。
実際、Requestクラスの中身を覗いてみるとallやonlyなどのメソッドが見つかります。
vendor\laravel\framework\src\Illuminate\Http\Request.php
Laravelでは至るところにFacadeが使われており、その恩恵が遺憾なく発揮されています。
便利なInputクラス
Inputクラスを使うと$name = Input::get('name')のように指定したパラメータを取り出すことができます。その他、
$input = Input::all();や
$input = Input::only('name', 'email');など必要なパラメータを簡単に取り出す方法が提供されています。
Inputクラスのソース
ということはInputクラスにこれらのスタティックメソッドが定義されているのだろうかと思ってソースを覗いてみるとvendor\laravel\framework\src\Illuminate\Support\Facades\Input.php
<?php namespace Illuminate\Support\Facades; class Input extends Facade { /** * Get an item from the input data. * * This method is used for all request verbs (GET, POST, PUT, and DELETE) * * @param string $key * @param mixed $default * @return mixed */ public static function get($key = null, $default = null) { return static::$app['request']--->input($key, $default); } /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'request'; } }getは確かにスタティックメソッドとして定義されていますが、allやonlyが見当たりません。
ただ、InputクラスはFacadeクラスを継承していて、getFacadeAccessor()という謎のメソッドが定義されていることはわかります。
FacadeといえばGoFのデザインパターンにあるFacade(ファサード)ですね。 サブシステムに仕事を投げるメソッドを提供するクラスを作り、サブシステムの独立性を高めるためのパターンです。
今回は、Input::allを例に取り、LaravelのFacadeの動作を見ていきます。
Facadeの動作
getFacadeAccessorはIoCコンテナで結合してある名前を返すだけのメソッドです。 ユーザがInput::allの実行を要求すると、getFacadeAccessor()の設定に従い、IoCコンテナでrequestという名前に結び付けられているインスタンスが呼び出され、要求されたallメソッドをそのオブジェクトに対して実行します。 つまり$input = Input::all();は
$input = App::make('request')->all();と同じ事です。 'request'がIoCコンテナで解決され、Requestクラスのインスタンスが返されます。
つまりInput::allやInput::onlyは実はRequestクラスのメソッドとして実行されていたのです。
実際、Requestクラスの中身を覗いてみるとallやonlyなどのメソッドが見つかります。
vendor\laravel\framework\src\Illuminate\Http\Request.php
<?php namespace Illuminate\Http; use Illuminate\Session\Store as SessionStore; use Symfony\Component\HttpFoundation\ParameterBag; class Request extends \Symfony\Component\HttpFoundation\Request { /// /** * Get all of the input and files for the request. * * @return array */ public function all() { return $this--->input() + $this->files->all(); } /// }FacadeによってInputクラスにRequestクラスの情報を含めることなく(クラスの独立性を保ったまま)Requestクラスのメソッドを利用することが可能になっていると言えます。
Laravelでは至るところにFacadeが使われており、その恩恵が遺憾なく発揮されています。