我目前正在用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'));
}除了模型类之外,...which在本质上是相同的。
我不想为每个模型创建一个单独的控制器,这是完全相同的。解决这个问题最简单、最优雅的方法是什么?我是否应该创建一个VocabController.php并为模型名添加一个参数,如下所示:
Route::resource('/vocab/{category}', 'VocabController');然后在这个控制器中添加一个构造函数方法,如下所示
public function __construct ($category) {
if ($category == 'nomen') {
$this->vocab = App\Nomen;
}
else if ($category == 'verb') {
$this->vocab = App\Verb;
}
}我想知道是否有更简单的方法来做到这一点。我可以通过路由模型绑定来实现这一点吗?
提前感谢
发布于 2016-12-03 14:46:43
只需在应用程序\特征中创建一个如下所示的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;
}注意:请注意,此示例只是针对您的特定情况的一种变通方法……每个人都有不同的代码实践,所以这个方法可能不是所有人都认可的……
发布于 2016-12-03 03:18:07
我认为最简单的方法就是只创建一个控制器,例如使用nomen、verb等方法的VocabController。
路由:
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已经从数据库中获取了模型。
https://stackoverflow.com/questions/40936906
复制相似问题