Laravel:一个控制器支持多个模型

Ben*_*ene 4 php model-view-controller laravel

我目前正在使用 Laravel 重建我的 vanilla-PHP-App,但遇到以下问题。我有多个数据库表,代表单词类别(名词、动词、副词……)。对于每个表,我创建了一个单独的模型、一个route::resource 和一个单独的资源控制器。例如:

NomenController.php

public function show($id)
{
    $vocab = Nomen::find($id);
    return view('glossarium.vocab_update', compact('vocab'));
}
Run Code Online (Sandbox Code Playgroud)

动词控制器.php

public function show($id)
{
    $vocab = Verb::find($id);
    return view('glossarium.vocab_update', compact('vocab'));
}
Run Code Online (Sandbox Code Playgroud)

...除了 Model 类之外,它们本质上是相同的。

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

Route::resource('/vocab/{category}', 'VocabController');
Run Code Online (Sandbox Code Playgroud)

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

public function __construct ($category) {
    if ($category == 'nomen') {
        $this->vocab = App\Nomen;
    }
    else if ($category == 'verb') {
         $this->vocab = App\Verb;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢

pra*_*hal 7

只需在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'));
    }

}
Run Code Online (Sandbox Code Playgroud)

在您的NomenControllerVerbController中,执行以下操作:

use App\Traits\CommonControllerFunctions;

class NomenController {

    use CommonControllerFunctions;

    protected $model = Nomen::class;

}
Run Code Online (Sandbox Code Playgroud)

use App\Traits\CommonControllerFunctions;

class VerbController {

    use CommonControllerFunctions;

    protected $model = Verb::class;

}
Run Code Online (Sandbox Code Playgroud)

注意:请注意,此示例只是针对您的特定情况的解决方法...每个人的代码实践方式都不同,因此此方法可能不会得到所有人的批准...