我不知道这是不是很好的做法。但我认为我可以把这部分代码放在一边:
$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);
}
}
答案 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
并逐步清理控制器。
我尚未验证此代码,因此请谨慎复制并粘贴。