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

时间:2016-12-02 16:33:30

标签: php laravel model-view-controller

我目前正在用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以某种方式做到这一点吗?

提前致谢

2 个答案:

答案 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,方法nomenverb以及您想要的任何内容。

路线:

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已从数据库中获取模型。