是否有可能将Illuminate\Http\Request
转换为使用php artisan make:request MyRequest
制作的自定义验证请求?
我希望在未来的方法中进行验证,以便我有:
protected function register(Request $request)
{
...
$this->userRepository->signup($request)
...
}
用户存储库:
public function signup(MyRequest $request)
{
...
}
这可能吗?我现在收到一个错误,因为预计会有一个班级。只有想到的是制作一个界面,但我不确定它是否可以起作用。
我得到的错误
类型错误:传递给UserRepository :: signup()的参数1必须是App \ Http \ Requests \ MyRequest的实例,给出Illuminate \ Http \ Request的实例
是的,没有问题,您应该创建:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class MyRequest extends FormRequest
{
public function rules() {
// here you put rules
}
}
并在您的控制器中:
public function signup(\App\Http\Requests\MyRequest $request)
{
...
}
请注意,您还应该在请求类中调整authorize
方法(根据用户访问权限返回true或false)
编辑
更新后 - 你应该在控制器和存储库中输入提示你的自定义类 - 这取决于你 - 我经常使用通用的Illuminate\Http\Request
,所以你应该这样做:
在控制器中:
public function controllerMethod(\App\Http\Requests\MyRequest $request)
在存储库中:
public function signup(\App\Http\Requests\MyRequest $request)
要么
public function signup(\Illuminate\Http\Request $request)
总而言之,你应该在控制器中使用Form请求类 - 这是进行验证的地方,之后你可以使用相同的类或通用的\Illuminate\Http\Request
- 我个人经常在存储库或服务中使用\Illuminate\Http\Request
,因为他们通常不会关心放入MyRequest
类的其他东西 - 他们只是想从请求类中获取数据,就是这样。
即使我的自定义类扩展了Request
,我也没有发现可以做我想要的事情,因为当然一个方法需要一个类的实例而另一个类获得另一个类。
也许有可能提取出一个接口并包装和绑定它,但这在我看来是一个quickfix。
我的观点是,我从一开始就认为这个概念是错误的,而且更多的是一个架构问题,所以我将我的应用程序转换为不同的方法,并设法首先避免这些问题。