localdisk

PHP とか Java とか Web とか好きなことを書きます。

Laravel で Controller から Controller を呼ぶ


たまーに、こんなことしたいことがありますね。で、まぁリダイレクトすればいいよ、みたいな回答したんですが、よく考えたら普通にできるよなーと。

まず、呼び出される 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 のメソッドを呼びたいというシチュエーションが発生した場合、リファクタリングのチャンスと思ってリファクタリングしたほうがいいんじゃないかなーと思います。色々あってそうも行かない時等にこのエントリを思い出していただければ幸い。