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

时间:2016-05-03 22:25:35

标签: php laravel-5

我不知道这是不是很好的做法。但我认为我可以把这部分代码放在一边:

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

某处不能在许多地方使用ctrl + c ctrl + v。你能告诉我在Laravel怎么办? 完整的例子:

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);
    }
}

2 个答案:

答案 0 :(得分:0)

您需要的是Laravel中的View Composer。

  

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

有关View Composers的更多信息:https://laravel.com/docs/5.2/views#view-composers

答案 1 :(得分:0)

您可能会考虑为每组数据库交互编写单独的Repository(和Service),方法名称可准确描述正在发生的事情,然后使用Laravels Dependency Injection framework连接它给你的控制器。 This是如何做到这一点的好资源。 This看起来也很有希望。 如果您预计此项目会变得更大并且应该保持可维护性(以及time and resources允许的话),这是推荐的方法。

你应该考虑一下你目前正在做的事情是否足够好"或者如果它将来变得不可维护并将实现更改为使用存储库(和可能的服务)。

稍微研究一下你的代码后,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并逐步清理控制器。

我尚未验证此代码,因此请谨慎复制并粘贴。