英文:
How to pass different custom requests with common Interface class?
问题
为了在不同的存储库类中传递不同的自定义请求,您可以通过以下方式触发CreateTagRequest类的验证:
在您的TagCrudRepository.php文件中,确保传递的$request参数是一个有效的CreateTagRequest实例,如下所示:
namespace App\Repositories;
use App\Http\Requests\CreateTagRequest;
use App\Repositories\Interfaces\CrudInterface;
class TagCrudRepository implements CrudInterface
{
public function store(array $data, $request): Tag
{
// 确保$request是CreateTagRequest的实例
if (!($request instanceof CreateTagRequest)) {
// 如果不是,请将其转换为CreateTagRequest实例
$request = new CreateTagRequest($request->all());
}
// 然后可以执行验证和存储操作
$validatedData = $request->validated();
// 接下来执行存储操作并返回结果
// ...
return $tag;
}
// 其他方法...
}
通过这种方式,您可以确保在存储操作中始终使用CreateTagRequest的验证规则。这样,无论哪个自定义请求您传递,都会触发验证。
英文:
Making Interface class for Crud operations I need in some cases to pass custom requests(ex. CreateTagReques)t and I make it with calling class
in controller as :
public function store(Request $request)
{
try {
\Log::info(' -1 BEFORE CreateTagRequest::'); // I see this log message
$tag = $this->tagCrudRepository->store(
data: $request->only('name'),
request: new CreateTagRequest($request->all())
);
that works, but validation method is not called actually, as :
I added log messages in app/Http/Requests/CreateTagRequest.php class :
class CreateTagRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
$request= request(); // I DO NOT SEE THIS MESSAGE :
\Log::info( '-1 CreateTagRequest $request->all()::' . print_r( $request->all(), true ) );
and I got error:
: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null (Connection: mysql, SQL: insert into `tags` (`name`) values (?))
So validation on CreateTagRequest class is not triggered. How can I trigger it ?
Problem is raised as TagCrudRepository class implements CrudInterface in app/Repositories/Interfaces/CrudInterface.php I have :
use Illuminate\Foundation\Http\FormRequest;
interface CrudInterface
{
public function store(array $data, $request): Model;
...
and app/Repositories/TagCrudRepository.php :
namespace App\Repositories;
use App\Http\Requests\CreateTagRequest;
use App\Repositories\Interfaces\CrudInterface;
class TagCrudRepository implements CrudInterface
{
public function store(array $data, $request): Tag
{
...
So having 1 CrudInterface for different repository classes I need to pass different custom requests and I failed in my attempt above...
How can I do it ?
答案1
得分: 2
在你的store
方法中,我发现你没有使用formrequest
。
Public function store(CreateTagRequest $request).
你的接口只能接收通过CreateTagRequest
验证后的数据。
在进行上述更改后,你可以将它更改为:
$tag = $this->tagCrudRepository->store(data: $request->validated());
在你的接口中,你可以只传递data
参数。
public function store(array $data)
请求不应该在存储库类或服务类中处理。
英文:
The thing I find is that on your store method you are not using formrequest.
Public function store(CreateTagRequest $request).
You interface can only receive the validated data that came after passing from CreateTagRequest.
After doing above mentioned changes you can change it to.
$tag = $this->tagCrudRepository->store(data: $request->validated());
On your interface you can change and only pass data parameter.
public function store(array $data)
Request is something which shouldn’t be handled on repository class or services class.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论