Ich habe ein BaseController
, die die Grundlage für die meisten HTTP Methoden für meinen API-Server bietet, z.B. die store
Methode:Laravel 5: Typ-Hinting FormRequest eine Klasse innerhalb einer Steuerung, die von Base erstreckt
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);
}
I dann auf dieser BaseController
in einer spezifischeren Controller erstrecken, wie beispielsweise die UserController
, etwa so:
UserController.php
class UserController extends BaseController {
public function __construct(UserRepository $repo)
{
$this->repo = $repo;
}
}
Das funktioniert super. Allerdings möchte ich jetzt UserController
erweitern Laravel 5 Der neue FormRequest
Klasse zu injizieren, die sich um Dinge wie Validierung und Authentifizierung für die User
Ressource nimmt. Ich würde das gerne so machen, indem ich die Speichermethode überschreibe und Laravel's Type-Hint-Dependency-Injection für seine Form Request-Klasse verwende.
UserController.php
public function store(UserFormRequest $request)
{
return parent::store($request);
}
Wo die UserFormRequest
von Request
erstreckt, die sich von FormRequest
erstreckt:
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'
];
}
}
Das Problem ist, dass die BaseController
erfordert ein Illuminate\Http\Request
Objekt während ich ein UserFormRequest
Objekt übergeben. Deshalb bekomme ich diesen Fehler:
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
Also, wie kann ich geben andeuten den UserFormRequest injizieren, während immer noch auf die Anforderung Anforderung des Base haften? Ich kann den BaseController nicht zwingen, ein UserFormRequest zu verlangen, weil es für irgendeine Ressource funktionieren sollte.
konnte ich eine Schnittstelle wie RepositoryFormRequest
sowohl in der BaseController
und der UserController
verwenden, aber dann das Problem, dass Laravel nicht mehr die UserFormController
durch seine Art Hinting Dependency Injection einspritzt.
Sie können die Methoden von Ihrer Base zu einem Trait bewegen und sie dann an den anderen Controller verwenden. – Ravan
Verwenden Sie Laravels RESTful Resource Controller? Und was bleibt bei den voreingestellten Namen wie 'store'? – Chris
@Chris ja ich bin. Ich bin mir nicht sicher, ob ich deiner Frage folge, kannst du das bitte umformulieren? – Tom