【发布时间】:2015-06-30 00:22:02
【问题描述】:
我有一个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);
}
然后我在一个更具体的控制器中扩展这个BaseController,比如UserController,像这样:
UserController.php
class UserController extends BaseController {
public function __construct(UserRepository $repo)
{
$this->repo = $repo;
}
}
这很好用。但是,我现在想扩展 UserController 以注入 Laravel 5 的新 FormRequest 类,它负责 User 资源的验证和身份验证等事情。我想这样做,通过覆盖 store 方法并为其 Form Request 类使用 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 对象。因此我得到这个错误:
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 的请求要求的同时键入提示注入 UserFormRequest?我不能强制 BaseController 要求 UserFormRequest,因为它适用于任何资源。
我可以在BaseController 和UserController 中使用类似RepositoryFormRequest 的接口,但问题是Laravel 不再通过其类型提示依赖注入来注入UserFormController。
【问题讨论】:
-
您可以将 BaseController 中的方法移动到 Trait,然后在其他控制器上使用它。
-
你在使用 Laravel 的 RESTful 资源控制器吗?那么像
store这样的预设名称要坚持什么? -
@Chris 是的,我是。我不确定我是否听懂了您的问题,请您改述一下吗?
-
呃,这是方法类型提示中的一个巨大设计缺陷......让整个事情看起来几乎没用。
标签: php laravel dependency-injection laravel-5 ioc-container