首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel:多个模型的一个控制器

Laravel:多个模型的一个控制器
EN

Stack Overflow用户
提问于 2016-12-03 00:33:30
回答 2查看 7.3K关注 0票数 3

我目前正在用Laravel重新构建我的vanilla-PHP-App,我有以下问题。我有多个数据库表,它们代表单词类别(名词,动词,副词,...)。我为每个表创建了一个单独的Model、一个route::resource和一个单独的resource-Controller。例如:

NomenController.php

代码语言:javascript
运行
复制
public function show($id)
{
    $vocab = Nomen::find($id);
    return view('glossarium.vocab_update', compact('vocab'));
}

VerbController.php

代码语言:javascript
运行
复制
public function show($id)
{
    $vocab = Verb::find($id);
    return view('glossarium.vocab_update', compact('vocab'));
}

除了模型类之外,...which在本质上是相同的。

我不想为每个模型创建一个单独的控制器,这是完全相同的。解决这个问题最简单、最优雅的方法是什么?我是否应该创建一个VocabController.php并为模型名添加一个参数,如下所示:

代码语言:javascript
运行
复制
Route::resource('/vocab/{category}', 'VocabController');

然后在这个控制器中添加一个构造函数方法,如下所示

代码语言:javascript
运行
复制
public function __construct ($category) {
    if ($category == 'nomen') {
        $this->vocab = App\Nomen;
    }
    else if ($category == 'verb') {
         $this->vocab = App\Verb;
    }
}

我想知道是否有更简单的方法来做到这一点。我可以通过路由模型绑定来实现这一点吗?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2016-12-03 14:46:43

只需在应用程序\特征中创建一个如下所示的trait,(您可以为它命名...不过,别跟我走...我觉得它很差劲。:P)

代码语言:javascript
运行
复制
namespace App\Traits;

trait CommonControllerFunctions {

    public function show($id) {
        $modelObject = $this->model;

        $model = $modelObject::find($id);

        return view('glossarium.vocab_update', compact('model'));
    }

}

在你的NomenControllerVerbController,中这样做:

代码语言:javascript
运行
复制
use App\Traits\CommonControllerFunctions;

class NomenController {

    use CommonControllerFunctions;

    protected $model = Nomen::class;

}

代码语言:javascript
运行
复制
use App\Traits\CommonControllerFunctions;

class VerbController {

    use CommonControllerFunctions;

    protected $model = Verb::class;

}

注意:请注意,此示例只是针对您的特定情况的一种变通方法……每个人都有不同的代码实践,所以这个方法可能不是所有人都认可的……

票数 4
EN

Stack Overflow用户

发布于 2016-12-03 03:18:07

我认为最简单的方法就是只创建一个控制器,例如使用nomenverb等方法的VocabController

路由:

代码语言:javascript
运行
复制
Route::get('/vocab/nomen/{nomen}', 'VocabController@item');
Route::get('/vocab/verb/{verb}', 'VocabController@item');

和模型绑定:

代码语言:javascript
运行
复制
Route::model('nomen', 'App\Nomen');
Route::model('verb', 'App\Varb');

那么你的方法应该是这样的:

代码语言:javascript
运行
复制
public function item($item)
{
    return view('glossarium.vocab_update', $item);
}

请记住,$item已经从数据库中获取了模型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40936906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档