Laravel验证器不适用于自定义请求和添加的params



我在laravel中有一个自定义请求类和一个服务类来处理我的应用程序中的所有请求。他们将处理具有两个不同控制器的api和web请求。但在web控制器中,当我尝试在动态中向请求添加参数时,validated((方法不会重新忽略它们。

web控制器:

public function index(ShopIndexRequest $request, ShopService $service)
{
$request->mergeIfMissing(['items' => 3]);
//other tries to adding parameters
//$request->request->add(['items' => 3]);
//request()->request->add(['items' => 3]);
//$request['items'] = 3;
$shops = $service->getall($request);

return view('shop.index', compact('shops'));
}

服务类别:

namespace AppServices;

use AppHttpRequestsShopShopIndexRequest;
use AppHttpResourcesShopResource;
use AppModelsShop;

class ShopService{

public function getAll(ShopIndexRequest $request)
{
$validated = $request->validated();
$query = Shop::query();

if(isset($validated['name'])){
$query->where('name', 'like', '%' . $validated['name'] . '%');
}

if(isset($validated['orderBy']) && isset($validated['orderDirection'])){
$query->orderBy($validated['orderBy'], $validated['orderDirection']);
}

if(isset($validated['items'])){
return ShopResource::collection($query->paginate($validated['items']));
}
else{
return ShopResource::collection($query->paginate(config('app.defaultItemsPagination')));
}

}
}

请求类别:

namespace AppHttpRequestsShop;

use IlluminateFoundationHttpFormRequest;

class ShopIndexRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'items' => 'integer|nullable',
'name' => 'string|nullable',
'orderBy' => 'string|nullable',
'orderDirection' => 'string|nullable'
];
}
}

在控制器中调用validated((方法后,它总是给我一个空数组。然而,在api控制器中,它与poster的工作非常好,接收我在每个请求中提供的参数,

以下是api控制器中的索引方法:

public function index(ShopIndexRequest $request, ShopService $service)
{
$shops = $service->getAll($request);
return $shops;
}

为什么validated((方法会忽略我用所有这些方法动态添加的数据?这是实现我目标的一种方式吗?

您可以模拟请求。然后,在测试中使用validated((作为请求的模拟方法,并设置validated返回所需值的期望值。

这模拟了服务类:

$this->shopServiceMock=Mockery::mock(ShopService::class(
$this->应用程序->实例(ShopService::class,$this->ShopServiceMock(;

现在构建一个包含已验证的返回自定义数据的请求

$request = $this->getMockBuilder(ShopIndexRequest::class)             - 
>setMethods(['validated'])->getMock(); 
$request->expects($this->once())->method('validated')         - 
>willReturn(true);  

现在创建一个服务类的实例,并将mock注入其中。

最新更新