【问题标题】:Laravel Reusing Controller LogicLaravel 重用控制器逻辑
【发布时间】:2017-08-10 02:36:06
【问题描述】:

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

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 的子控制器是否是个好主意?

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.4


    【解决方案1】:

    您可以将逻辑抽象为服务类。我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.
        }
    
    }
    

    【讨论】:

    • 我知道这个练习,别担心 ;) 在我接受之前,我只是尝试一下并探索我将如何在我的环境中实现它。
    • @Enstage 不用担心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2015-01-18
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多