我在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
也因某种原因无效。
答案 0 :(得分:1)
您可以使用 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;