我目前正在用Laravel重建我的vanilla-PHP-App,我遇到了以下问题。 我有多个数据库表,代表单词类别(名词,动词,副词,...)。对于每个表,我创建了一个单独的Model,一个route :: resource和一个单独的resource-Controller。例如:
NomenController.php
public function show($id)
{
$vocab = Nomen::find($id);
return view('glossarium.vocab_update', compact('vocab'));
}
和
VerbController.php
public function show($id)
{
$vocab = Verb::find($id);
return view('glossarium.vocab_update', compact('vocab'));
}
...除了Model类之外基本相同。
我不想为每个模型创建一个单独的Controller,它完全相同。解决这个问题最简单,最优雅的方法是什么? 我应该只创建一个VocabController.php并为Model-name添加一个参数,如:
Route::resource('/vocab/{category}', 'VocabController');
然后在此控制器中添加构造函数方法,如
public function __construct ($category) {
if ($category == 'nomen') {
$this->vocab = App\Nomen;
}
else if ($category == 'verb') {
$this->vocab = App\Verb;
}
}
我想知道是否有更简单的方法可以做到这一点。我可以用Route Model Binding以某种方式做到这一点吗?
提前致谢
答案 0 :(得分:2)
只需在 App \ Traits 中创建这样的trait
,(你可以说出任何名字......不要跟我一起去......我觉得它很蹩脚。 ..:P)
namespace App\Traits;
trait CommonControllerFunctions {
public function show($id) {
$modelObject = $this->model;
$model = $modelObject::find($id);
return view('glossarium.vocab_update', compact('model'));
}
}
并在 NomenController 和 VerbController 中,执行以下操作:
use App\Traits\CommonControllerFunctions;
class NomenController {
use CommonControllerFunctions;
protected $model = Nomen::class;
}
和
use App\Traits\CommonControllerFunctions;
class VerbController {
use CommonControllerFunctions;
protected $model = Verb::class;
}
注意:请注意,此示例仅针对您的特定情况进行解决...每个人都以不同的方式练习代码,因此所有人都不会批准此方法...
答案 1 :(得分:1)
我认为最简单的方法是只创建一个控制器,例如VocabController
,方法nomen
,verb
以及您想要的任何内容。
路线:
Route::get('/vocab/nomen/{nomen}', 'VocabController@item');
Route::get('/vocab/verb/{verb}', 'VocabController@item');
模型绑定:
Route::model('nomen', 'App\Nomen');
Route::model('verb', 'App\Varb');
然后你的方法看起来像那样:
public function item($item)
{
return view('glossarium.vocab_update', $item);
}
请记住,$item
已从数据库中获取模型。