Ho uno BaseController
che fornisce la base per la maggior parte dei metodi HTTP per il mio server API, ad es. il metodo store
:Laravel 5: digitare una classe FormRequest all'interno di un controller che si estende da BaseController
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);
}
poi estendo su questa BaseController
in un controllore più specifico, come il UserController
, così:
UserController.php
class UserController extends BaseController {
public function __construct(UserRepository $repo)
{
$this->repo = $repo;
}
}
Funziona alla grande. Tuttavia, ora desidero estendere UserController
per iniettare la nuova classe di Laravel 5 FormRequest
, che si occupa di cose come la convalida e l'autenticazione per la risorsa User
. Mi piacerebbe farlo in questo modo, sovrascrivendo il metodo store e usando l'injection di tipo hint di Laravel per la sua classe Form Request.
UserController.php
public function store(UserFormRequest $request)
{
return parent::store($request);
}
Qualora la UserFormRequest
estende da Request
, che si estende da 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'
];
}
}
Il problema è che il BaseController
richiede un oggetto Illuminate\Http\Request
mentre io passo un oggetto UserFormRequest
. Perciò io ottengo questo errore:
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
Quindi, come posso digitare accennare iniettare l'UserFormRequest, pur aderendo alla richiesta requisito del BaseController? Non posso forzare il BaseController a richiedere un UserFormRequest, perché dovrebbe funzionare per qualsiasi risorsa.
ho potuto utilizzare un'interfaccia come RepositoryFormRequest
sia nel BaseController
e UserController
, ma il problema è che laravel più inietta il UserFormController
attraverso il suo tipo suggerendo iniezione di dipendenza.
È possibile spostare i metodi dal BaseController a un tratto e quindi utilizzarlo sugli altri controller. – Ravan
Stai usando i controller di risorse RESTful di Laravel? E quindi cosa attaccare ai nomi preimpostati come 'store'? – Chris
@Chris si sono. Non sono sicuro di seguire la tua domanda, potresti riformulare la frase? – Tom