Laravel 5.2.3在几个控制器/方法中重复了部分代码


Laravel 5.2.3 repeated part of code in several controllers/methods

我不知道这是否是一个好的做法。但我认为我可以把这部分代码:

        $categories = DB::table('categories')
        //[something]
        ->get();

在许多地方,不使用ctrl+ctrl+v。你能告诉我在拉拉维尔我能用它做什么吗?完整示例:

class FirstController extends Controller
{
    public function index()
    {
        $articles = DB::table('articles')
            //[something]
            ->get();

        $categories = DB::table('categories')
            //[something]
            ->get();
        return view('pages.home', compact('articles', 'categories'));
    }
    public function show($id)
    {
        $categories = DB::table('categories')
            //[something]
            ->get();
        $article = Article::findOrFail($id);
        return view('pages.show', compact('article', 'categories'));
    }
}
class SecondController extends Controller
{
    public function index()
    {
        $categories = DB::table('categories')
            //[something]
            ->get();
        return view('pages.contact')->with('categories', $categories);
    }
}

您可能会考虑为每组数据库交互编写一个单独的Repository(和Service),方法名准确描述正在发生的事情,然后使用Laravels依赖注入框架将其连接到控制器。这是关于如何做到这一点的一个很好的资源。这看起来也很有希望如果您预计此项目将变得更大并应保持可维护性(并且您的时间和资源允许),则建议使用此方法

您应该考虑当前所做的是否"足够好",或者将来是否会变得不可维护,并将实现更改为使用存储库(以及可能的服务)。


仔细研究一下你的代码后,CategoryRepository看起来像这样:

use Illuminate'Database'ConnectionInterface;
class CategoryRepository {
    protected $connectionInterface;
    public function __construct(ConnectionInterface $_connectionInterface) {
        $this->connectionInterface = $_connectionInterface;
    }
    public function all() {
        return db::table('categories')
            //[something]
            ->get();
    }
}

然后你可以参考并在你的控制器中使用,比如:

class FirstController extends Controller {
    protected $categoryRepository;
    public function __construct(CategoryRepository $_categoryRepository) {
        $this->categoryRepository = $_categoryRepository;
    }
    ...
    public function show($id) {
        $categories = $this->categoryRepository->all();
        $article = Article::findOrFail($id);
        return view('pages.show', compact('article', 'categories'));
    }
    ...
}

然后,您可以尝试编写get方法、save方法等。之后,您可以编写ArticleRepository并逐步清理控制器。

我还没有验证这个代码,所以复制和粘贴时要小心

您需要的是Laravel中的View Composer。

视图编写器是在渲染视图时调用的回调或类方法。如果您有希望在每次渲染视图时绑定到该视图的数据,则视图编辑器可以帮助您将该逻辑组织到单个位置。

有关视图编辑器的详细信息:https://laravel.com/docs/5.2/views#view-作曲家