Laravel重用控制器逻辑

时间:2017-08-10 02:36:07

标签: php laravel laravel-5 laravel-5.4

我有多个控制器,有多个方法,都返回视图。

class PageController extends Controller {
    public function index()
    {
        // do lots of stuff
        return view('view.name', $lotsOfStuffArray);
    }

    public function list()
    {
    //...and so on
}

我现在需要创建一个API,它执行与上述方法大致相同的逻辑,但是返回一个JSON输出:

class PageApiController extends Controller {
    public function index()
    {
        // do lots of the same stuff
        return $lotsOfStuffCollection;
    }

    public function list()
    {
    //...and so on
}

在不必将代码从一个控制器复制并粘贴到另一个控制器的情况下,实现此目的的最佳方法是什么?

我尝试将大量逻辑放入特征并在我的Eloquent模型中使用它们,但这仍然要求我将代码从控制器复制并粘贴到控制器。我还应该注意,检查expectsJson()并且相应地返回响应是不可行的,因为我有很多很多方法。

将逻辑存储在父类中然后创建一个用视图响应的子控制器和一个用JSON响应的子控制器是不是一个好主意?

1 个答案:

答案 0 :(得分:6)

您可以将逻辑抽象为服务类。我have answered a similar question

您有PageController,PageAPIController和PageService。

class PageService {
    public function doStuff()
    {
        return $stuff;
    }
}

class PageController extends Controller {
    public function index()
    {
        $service = new PageService();
        $stuff = $service->doStuff();
        return $stuff;
    }

}

class PageAPIController extends Controller {
    public function index()
    {
        $service = new PageService();
        $stuff = $service->doStuff();
        return $stuff->toJSON();
    }

    protected function toJSON(){
       //You could also abstract that to a service or a trait.
    }

}