У меня есть BaseController, который обеспечивает основу большинства HTTP-методов для моего сервера API, например. метод 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, чтобы добавить новый класс FormRequest класса Laravel 5, который позаботится о таких вещах, как проверка и аутентификация для ресурса User. Я хотел бы сделать это, например, путем перезаписи метода хранилища и использования инъекции зависимостей типа Laravel для класса Form Request.
UserController.php
public function store(UserFormRequest $request)
{
return parent::store($request);
}
Где UserFormRequest простирается от 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
Итак, как я могу ввести подсказку, введя UserFormRequest, все еще придерживаясь требования запроса BaseController? Я не могу заставить BaseController потребовать UserFormRequest, потому что он должен работать для любого ресурса.
Я мог бы использовать интерфейс типа RepositoryFormRequest как в BaseController, так и в UserController, но тогда проблема заключается в том, что Laravel больше не вводит UserFormController через свой тип, навязывающий инъекцию зависимостей.