【问题标题】:Avoiding duplicate code in two controllers in Laravel 5.1避免 Laravel 5.1 中两个控制器中的重复代码
【发布时间】:2016-05-06 09:51:28
【问题描述】:

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

路线如下:

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

那么我的控制器中的代码是这样的:

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
}

我的 routes.php 文件中也有这条路由来查看博客文章:

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

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

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

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

【问题讨论】:

  • 你考虑过使用特征吗?如果使用抽象基类或通过构造函数或 setter 方法注入的依赖项没有意义,我倾向于使用这种方法对代码进行重复数据删除。
  • 我以前从未使用过特征,但它看起来很有希望。你能告诉我你会在 Laravel 项目中放置一个 trait 吗?
  • 它的行为与一个类的位置完全一样吗?
  • 这个特性效果很好。如果你给出一个实际的答案,我会把它作为答案。

标签: php laravel-5.1 laravel-routing


【解决方案1】:

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

return Blog::RenderFrontendView($blog_id);

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

更新:我不再使用这种方法,因为使用 trait 是一个更好的解决方案

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多