在 "create policy" 中访问@store 参数
Access @store arguments in "create policy"
我在 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
由于某种原因无法正常工作。
$request
有一个方法 has()
用于确定值是否存在 (Link)。
您可以更改方法以检查该值是否存在或其等于 "PLAIN"
public function create(User $user, Request $request)
{
return !$request->has('kind') || $request->input('kind') == 'PLAIN';
}
您可以使用 request() 辅助方法。
使用
return ( $request->has('kind') )? $request->has('kind') && $request->input('kind') === 'PLAIN': true;
假设你想为给定的消息创建一个宠物,在这种情况下 implicit model binding 在这里不起作用,因为宠物还没有创建,所以通过给定的 id 找到宠物总是 return空。
在这种情况下 laravel 提供了使用不需要模型的操作的可能性(参见 documentation -> 通过中间件部分)
Again, some actions like create may not require a model instance. In
these situations, you may pass a class name to the middleware. The
class name will be used to determine which policy to use when
authorizing the action
所以在你的情况下:
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';
}
我在 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
由于某种原因无法正常工作。
$request
有一个方法 has()
用于确定值是否存在 (Link)。
您可以更改方法以检查该值是否存在或其等于 "PLAIN"
public function create(User $user, Request $request)
{
return !$request->has('kind') || $request->input('kind') == 'PLAIN';
}
您可以使用 request() 辅助方法。
使用
return ( $request->has('kind') )? $request->has('kind') && $request->input('kind') === 'PLAIN': true;
假设你想为给定的消息创建一个宠物,在这种情况下 implicit model binding 在这里不起作用,因为宠物还没有创建,所以通过给定的 id 找到宠物总是 return空。
在这种情况下 laravel 提供了使用不需要模型的操作的可能性(参见 documentation -> 通过中间件部分)
Again, some actions like create may not require a model instance. In these situations, you may pass a class name to the middleware. The class name will be used to determine which policy to use when authorizing the action
所以在你的情况下:
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';
}