在"中创建策略"访问@store参数

时间:2017-10-16 19:04:51

标签: laravel laravel-5.5

我在routes/api.php中有这样的路线:

Route::group(['middleware' => 'auth:api'], function() {

    Route::post('messages/{pet}', 'MessageController@store')->middleware('can:create,message');

});

我们在这里看到它隐含{pet}

我的控制器访问{pet}就像这样:

app\Http\Controllers\MessageController.php

public function store(Request $request, Pet $pet)
{
    dd($pet);
}

我希望我的->middleware('can:create,message')能够获得store在此处看到的论点,所以我想要$request$pet,这可能吗?

这是我当前的MessagePolicy@create,但它没有得到我期望的论点:

app\Policies\MessagePolicy.php

public function create(User $user, Request $request, Pet $pet)
{
    dd($request); // dd($pet);
    return $user->can('view', $pet) && ($request->input('kind') == null|| $request->input('kind') == 'PLAIN');
}

dd也因某种原因无效。

4 个答案:

答案 0 :(得分:1)

您可以使用 request()辅助方法。

https://laravel.com/docs/5.5/helpers#method-request

答案 1 :(得分:1)

假设你想为给定的消息创建一个宠物,在这种情况下implicit model binding在这里不起作用,因为尚未创建的宠物所以通过给定的id找到一个宠物将始终返回null。

在这种情况下,laravel提供了使用不需要模型的动作的可能性(参见documentation - >通过中间件部分)

  

同样,某些操作(如create)可能不需要模型实例。在   在这些情况下,您可以将类名传递给中间件。该   类名将用于确定何时使用哪个策略   授权行动

所以在你的情况下:

Route::group(['middleware' => 'auth:api'], function() {

    Route::post('messages/{pet}', 'MessageController@store')->middleware('can:create,App\Pet');

});

PetPolicy 中,您可以使用request()辅助方法:

public function create(User $user)
{
    return request('kind') == null|| request('kind') == 'PLAIN';
}

答案 2 :(得分:0)

$request有一个方法has(),用于确定是否存在值(Link)。 您可以更改方法以检查值是否存在或等于"PLAIN"

public function create(User $user, Request $request)
{
    return !$request->has('kind') || $request->input('kind') == 'PLAIN';
}

答案 3 :(得分:0)

使用

return ( $request->has('kind') )? $request->has('kind') && $request->input('kind') === 'PLAIN': true;