Laravel 5:在从 BaseController 扩展的控制器内部键入 FormRequest 类
我有一个为我的API服务器的大多数HTTP方法提供基础,例如该方法:BaseController
store
基本控制器.php
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store(Request $request)
{
$result = $this->repo->create($request);
return response()->json($result, 200);
}
然后,我在一个更具体的控制器中对此进行扩展,例如 ,如下所示:BaseController
UserController
用户控制器.php
class UserController extends BaseController {
public function __construct(UserRepository $repo)
{
$this->repo = $repo;
}
}
这效果很好。但是,我现在想扩展以注入Laravel 5的新类,该类负责资源的验证和身份验证等事务。我想这样做,通过覆盖存储方法并使用Laravel的类型提示依赖注入其Form Request类。UserController
FormRequest
User
用户控制器.php
public function store(UserFormRequest $request)
{
return parent::store($request);
}
其中 从 扩展,其本身从 :UserFormRequest
Request
FormRequest
用户表单请求.php
class UserFormRequest extends Request {
/**
* 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
*/
public function rules()
{
return [
'name' => 'required',
'email' => 'required'
];
}
}
问题是 需要一个对象,而我传递一个对象。因此,我得到这个错误:BaseController
Illuminate\Http\Request
UserFormRequest
in UserController.php line 6
at HandleExceptions->handleError('2048', 'Declaration of Bloomon\Bloomapi3\Repositories\User\UserController::store() should be compatible with Bloomon\Bloomapi3\Http\Controllers\BaseController::store(Illuminate\Http\Request $request)', '/home/tom/projects/bloomon/bloomapi3/app/Repositories/User/UserController.php', '6', array('file' => '/home/tom/projects/bloomon/bloomapi3/app/Repositories/User/UserController.php')) in UserController.php line 6
那么,如何在仍然遵守基本控制器请求要求的同时键入提示注入UserFormRequest?我不能强制 BaseController 要求 UserFormRequest,因为它应该适用于任何资源。
我可以使用像 the 和 the 这样的接口,但问题是 Laravel 不再通过其类型提示依赖注入注入。RepositoryFormRequest
BaseController
UserController
UserFormController