Sto applicando l'Iniezione di Dipendenza anziché l'Ereditarietà. Ma ora ho il problema della duplicazione del codice .
Main Controller
final class PreferenceController implements PreferenceInterface
{
protected $preferenceRepository;
/**
* PreferenceController constructor.
* @param PreferenceRepository $preferenceRepository
*/
public function __construct(PreferenceRepository $preferenceRepository)
{
$this->preferenceRepository = $preferenceRepository;
}
public function user(Request $request)
{
return response()->json($this->preferenceRepository->getByUser($request->attributes->get('user')));
}
public function save(Request $request, array $data)
{
return response()->json($this->preferenceRepository->saveByUser(
$request->attributes->get('user'), $data));
}
}
Esempio 1 con delega
final class CategoryPreferenceController implements PreferenceInterface
{
private $preferenceController;
public function __construct(PreferenceController $preferenceController)
{
$this->preferenceController = $preferenceController;
}
public function user(Request $request)
{
return $this->preferenceController->user($request);
}
public function save(CategoryPreferenceFormRequest $request)
{
return $this->preferenceController->save($request, $request->input('categories'));
}
}
Esempio 2 con delega
class MailPreferenceController implements PreferenceInterface
{
private $preferenceController;
public function __construct(PreferenceController $preferenceController)
{
$this->preferenceController = $preferenceController;
}
public function user(Request $request)
{
return $this->preferenceController->user($request);
}
public function save(MailPreferenceFormRequest $request)
{
return $this->preferenceController->save($request, $request->all());
}
}
Per essere più specifici ...
Come puoi vedere, ho reso il metodo save
più specifico:
- Richiedi parametro (PreferenceController) = > CategoryPreferenceFormRequest (CategoryPreferenceController)
- Richiedi parametro (PreferenceController) = > MailPreferenceFormRequest (MailPreferenceController)
Qual è il problema?
Il constructor
e il metodo user
sono duplicati in entrambe le implementazioni.
Che cosa ho provato?
-
I posso ereditare CategoryPreferenceController e MailPreferenceController da PreferenceController, in questo modo:
class PreferenceController { protected $preferenceRepository; /** * PreferenceController constructor. * @param PreferenceRepository $preferenceRepository */ protected function __construct(PreferenceRepository $preferenceRepository) { $this->preferenceRepository = $preferenceRepository; } final protected function user(Request $request) { return response()->json($this->preferenceRepository->getByUser($request->attributes->get('user'))); } final protected function handleSave(Request $request, array $data) { return response()->json($this->preferenceRepository->saveByUser( $request->attributes->get('user'), $data)); }
}
E nella classe figlio, chiamo il genitore handleSave
:
public function save(CategoryPreferenceFormRequest $request)
{
return $this->handleSave($request, $request->input('categories'));
}
Ma, penso che questa sia una brutta soluzione.
- Non posso ereditare CategoryPreferenceController e MailPreferenceController da PreferenceController, perché il metodo
save
non ha la stessa dichiarazione - Non riesco a rendere astratto PreferenceController, perché questa classe è completamente implementata
Come evitare la duplicazione del codice in questo caso?