我有一个BaseController
,为我的API服务器提供大多数HTTP方法的基础,例如store
方法:
BaseController.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);
}
我接着在一个更具体的控制器中,比如说UserController
,继承这个BaseController
,像这样:
UserController.php
class UserController extends BaseController {
public function __construct(UserRepository $repo)
{
$this->repo = $repo;
}
}
这很好用。然而,我现在想扩展UserController
以注入Laravel 5的新FormRequest
类,它可以处理像验证和认证User
资源这样的事情。我想这样做,通过重写存储方法并使用Laravel的类型提示依赖注入其表单请求类。
UserController.php
public function store(UserFormRequest $request)
{
return parent::store($request);
}
当 UserFormRequest
继承自 Request
,而Request
本身则继承自FormRequest
时:
UserFormRequest.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
对象。因此我得到了这个错误:
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
那么,我如何在仍遵循BaseController的Request要求的情况下进行类型提示注入UserFormRequest?我不能强制BaseController需要一个UserFormRequest,因为它应该适用于任何资源。
我可以在BaseController和UserController中都使用一个接口,比如RepositoryFormRequest,但问题是Laravel不再通过其类型提示依赖注入注入UserFormController。