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)
我想知道是否有更简单的方法可以做到这一点。我可以通过路由模型绑定来做到这一点吗?
提前致谢
只需在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)
在您的NomenController和VerbController中,执行以下操作:
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)
注意:请注意,此示例只是针对您的特定情况的解决方法...每个人的代码实践方式都不同,因此此方法可能不会得到所有人的批准...
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           9818 次  |  
        
|   最近记录:  |