避免在Laravel 5.1中的两个控制器中重复代码


Avoiding duplicate code in two controllers in Laravel 5.1

我在Laravel 5.1中有一条路由,它将接受一个通用的永久链接,并且需要确定它属于哪个对象(例如,它是"博客"还是"故事"的永久链接?

路线如下所示:

// .... Every other route in the routes.php file //
Route::get('{generic_url}', 'CMSController@generic');

然后 my 控制器中的代码如下所示:

public function generic($generic_url) {
    $blog = Blog::where('permalink', $generic_url)->first();
    if(!is_null($blog)) {
        // Load a blog entry page
    }
    // Something basically the same as above but for Story
}

我的路线中也有这条路线.php文件以查看博客文章:

Route::get('/blog/{blog_id}', 'BlogController@view');

第二条路线的目的是让我粗略地查看博客文章页面,以及我调试特定帖子的快速方法。

我希望避免将视图代码放在两个单独的控制器中。我的第一个想法是尝试找到一种方法让CMSController在BlogController中调用视图操作。对我来说,这听起来是一个糟糕的主意,一些搜索证实了这是一个糟糕的主意。

我的问题是,处理这种情况的最佳方法是什么?

目前,我决定在我的博客模型中添加一个静态方法并将其放置在控制器中:

return Blog::RenderFrontendView($blog_id);

我知道这似乎有点奇怪,因为我已经在我正在使用这段代码的地方之一加载了模型,但在我正在做的事情的上下文中,这是有道理的。它在缓存中查找以检索所有信息,我打算进行进一步优化以仅加载 ID 而不是整个模型。

更新:我不再使用此方法,因为使用特征是一个更好的解决方案