在Laravel控制器中动态指定模型

时间:2017-10-23 11:19:47

标签: php laravel laravel-5

我正在使用一个抽象的控制器类,它由我项目中的每个模型控制器进行扩展。

目前,每个模型控制器都在构造函数中设置模型的类,抽象使用它来加载适当的对象。

所以举一个简单的例子,我的摘要有

public function show($id){
    $object = $this->model::findOrFail($id);
    $this->authorize('view', $object);
    return view($this->view_dir.'.show',$object);
}

和我的Referee类使用包含

的构造函数扩展它
public function __construct(){
    $this->middleware('auth');
    $this->model = 'App\Referee';
    $this->view_dir = 'referees'
}

这工作正常,但我更愿意切换到使用授权中间件而不必记住手动授权控制器方法中的每个操作。

据我了解,为了做到这一点,我需要使用模型键入show方法,但这仅作为摘要的属性提供(我认为它不可能有动态类型)。

是否有另一种方法将模型绑定到控制器?理想情况下,我想在子类的构造函数中。

1 个答案:

答案 0 :(得分:0)

在控制器方法上对模型进行类型设置是Route model binding,而不是授权

路线模型绑定是指您编写

之类的路线
Route::get('books/{book}', 'BooksController@show');

,你的控制器方法将是

public function show(Book $book)
{
    // here $book is already the model instance, not the id. It throws 404 automatically if can't find the book by the primary key
}

当你在文档

上看到这个时
$this->authorize('update', $post);

这是因为您正在检查Post实例的授权(DB上的记录,而不是模型)

要授权对资源(模型,而不是DB上的记录)的操作,您需要这样做:

$this->authorize('create', Post::class);