Illuminate Containerを知る 前編

Posted: 2014-03-01 19:07 |  PHP全般 
みなさんiocコンテナ好きですか?

自分はこれを使ってフレームワークじゃないですが、
パッケージみたいなのも作ってしまうくらい触ってみました。

サービスロケーターとDIとか、色々な話になるので
ここでは細かい事は置いておきましょう。

laravel4は各機能のそれぞれが独立したコンポーネントになっているのはみなさんご存知でしょうか?
特にIocコンテナのilluminate\Containerと、
database周りのilluminate\database
かなり使い勝手が良いのでオススメです。
databaseは、PDOを用いたシンプルなものと、
queryBuilder, eloquentと3種が同様に使えますので、ちょっとしたマイクロフレームワークを作ったり、
または他のフレームワークのデータベース周りに使ったりできますよ!

では早速containerを触ってみましょう。
4.2のものを使っても良いので好きなものを使ってみてください。
composer

    "require": {
        "illuminate/container": "4.1.*"
    },
よくあるもの
class Sample
{
	public function action()
	{
		echo "action\n";
	}
}
$sample = new Sample();
$sample->action();
ではまずは一番ベーシックな、
インスタンスを生成して実行するだけの場合は下記の様になります。
require __DIR__ . "/vendor/autoload.php";
class Sample
{
	public function action()
	{
		echo "action\n";
	}
}
$container = new \Illuminate\Container\Container;
$container->make('Sample')->action();
簡単ですね。
コンテナからインスタンスをもらい、actionメソッドを実行しただけです。
いつでもどこでも好きな様に実行できます。
次にSampleで他の何かが欲しい場合はどうしますか?
あるクラスが必要な場合は下記の様に使用できます
require __DIR__ . "/vendor/autoload.php";

class Hoge 
{
	public function get()
	{
		return "hoge\n";
	}
}

class Sample
{
        protected $hoge;
	/**
	 * @param Hoge $hoge
	 */
	public function __construct(Hoge $hoge)
	{
		$this->hoge = $hoge;
	}

	public function action()
	{
        echo $this->hoge->get();
	}
}
$container = new \Illuminate\Container\Container;
$container->make('Sample')->action();
タイプヒントで必要なクラスを記述してみました。
依存のうんたらかんたらの話はまた別の機会にするか、
ネットで色々検索してみてください。
ここでは簡単に扱えるよ!と云いたいだけなので小難しい話は省きます。
phpのリフレクションを使って何も考えずに、getメソッドを実行する事ができます。
 

それだけではなく、

HogeクラスがFugaを使用している場合でも何も考えずにさらに必要なものを勝手に見つけてきてくれます。
require __DIR__ . "/vendor/autoload.php";
class Fuga
{
	public function fuga()
	{
		return "fuga\n";
	}
}

class Hoge 
{
	/**
	 * @param Fuga $fuga
	 */
	public function __construct(Fuga $fuga)
	{
		$this->fuga = $fuga;
	}

	public function get()
	{
        echo $this->fuga->fuga();
		return "hoge\n";
	}
}

class Sample
{
        protected $hoge;
	/**
	 * @param Hoge $hoge
	 */
	public function __construct(Hoge $hoge)
	{
		$this->hoge = $hoge;
	}

	public function action()
	{
        echo $this->hoge->get();
	}
}
$container = new \Illuminate\Container\Container;
$container->make('Sample')->action();
極端な例ですが、Fugaクラスも見事に実行してくれるわけです。
interfaceとかコンストラクタで引数が必要なやつを使うときはどうするんだという話ですが、
それはまた次回に。
auraのDI等も同じようなものです。
どこかで各DIコンテナのベンチマーク的な記事を見かけたので、
見てみるといいかもしれませんね

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014