Laravel で Controller から Controller を呼ぶ
@syossan27 やりたいことがピンときませんが、処理が終わったらもう一つのアクションにリダイレクトしてみてはいかがでしょうか?
— MATSUO Masaru (@localdisk) 2014, 5月 12
たまーに、こんなことしたいことがありますね。で、まぁリダイレクトすればいいよ、みたいな回答したんですが、よく考えたら普通にできるよなーと。
まず、呼び出される CalledController
.
<?php class CalledController extends \BaseController { protected $user; public function __construct(User $user) { $this->user = $user; } public function getUser() { return $this->user; } }
この getUser
を呼び出したいとします。
で、呼び出す側。CallController
はこんな実装になります。
<?php class CallController extends \BaseController { public function getIndex() { $called = app()->make('CalledController'); $user = $called->getUser(); var_dump($user); } }
app()->make('CalledController')
でコンテナ経由で CalledController
のインスタンスを取得しています。なので CalledController
に定義されているコンストラクタインジェクションが機能しててちゃんとインジェクションされた User
クラスが取得できるわけです。
もちろんコンストラクタで CalledController
をインジェクションすることもできます。
<?php class CallController extends \BaseController { protected $called; public function __construct(CalledController $called) { $this->called = $called; } public function getIndex() { $user = $this->called->getUser(); var_dump($user); } }
まぁ、Controller から別の Controller のメソッドを呼びたいというシチュエーションが発生した場合、リファクタリングのチャンスと思ってリファクタリングしたほうがいいんじゃないかなーと思います。色々あってそうも行かない時等にこのエントリを思い出していただければ幸い。