開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. LaravelのInputとFacade(ファサード)
no-image

LaravelのInputとFacade(ファサード)

次はリクエストと入力について書こうかと思っていたところ、ドキュメントと同じ内容しか書けなさそうなのでInputクラスの中身を読んでみることにしました。

便利な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が使われており、その恩恵が遺憾なく発揮されています。
TOPに戻る