@axelbest:
Przykład 2 kontrolery dziedziczące po bazowym, każdy z kontrolerów posiada właściwość Model oraz arrayke wskazującą jaki Request stosować do danej metody. Wszystkie dziedziczą 5 metod index, create, edit, update i destroy z kontrolera bazowego. Może żywy przykład na kodzie:
<?php
class BaseController {
// Model
protected $model;
// Request array
protected $requestArray = [];
/**
* Index, listing of all available items
*/
public function index() {
// Pobranie requesta dla tego typu
$request = $this->requestArray['index'];
// Walidacja requestu (dla każdego kontrolera dziedziczącego będzie to inna klasa)
$validatedInput = $request->validated();
// wyświetlenie cruda uruchamiając odpowiedni widok zależnie od modelu
}
/**
* Display create form template for resource
*/
public function create() {
// Pobranie requesta dla tego typu
$request = $this->requestArray['create'];
// Walidacja requestu (dla każdego kontrolera dziedziczącego będzie to inna klasa)
$validatedInput = $request->validated();
// wyświetlenie formularza dodania dla cruda uruchamiając odpowiedni widok zależnie od modelu i spełnionych warunków requesta
}
/**
* Display edit form for specific entity
*/
public function edit(Request $request, int $id) {
// Pobranie requesta dla tego typu
$request = $this->requestArray['edit'];
// Walidacja requestu (dla każdego kontrolera dziedziczącego będzie to inna klasa)
$validatedInput = $request->validated();
// wyświetlenie formularza edycji elementu dla cruda uruchamiając odpowiedni widok zależnie od modelu i spełnionych warunków requesta
}
/**
* Store new entity in database
*/
public function store() {
// Pobranie requesta dla tego typu
$request = $this->requestArray['store'];
// Walidacja requestu (dla każdego kontrolera dziedziczącego będzie to inna klasa)
$validatedInput = $request->validated();
// Implementacja tworząca element i zapisująca do bazy
}
/**
* Save existing entity in database
*
* @param int $id
*/
public function update(int $id) {
// Pobranie requesta dla tego typu
$request = $this->requestArray['update'];
// Walidacja requestu (dla każdego kontrolera dziedziczącego będzie to inna klasa)
$validatedInput = $request->validated();
// Implementacja aktualizująca element i zapisująca do bazy
}
/**
* Delete entity
*
* @param int $id
*/
public function destroy(int $id) {
// Pobranie requesta dla tego typu
$request = $this->requestArray['destroy'];
// Walidacja requestu (dla każdego kontrolera dziedziczącego będzie to inna klasa)
$validatedInput = $request->validated();
// Implementacja usuwania elementu z bazy
}
}
I teraz przykładowo dwa kontrolery dziedziczące (kontroler produktów i artykułów):
<?php
use App\Model\Article;
use App\Requests\{CreateArticleRequest, UpdateArticleRequest};
class ArticlesController extends BaseController {
/**
* @var Model
*/
protected $model = Article::class;
/**
* @var array
*/
protected $requestArray = [
'store' => CreateArticleRequest::class,
'update' => UpdateArticleRequest::class
];
}
<?php
use App\Model\Product;
use App\Requests\{CreateProductRequest, UpdateProductRequest};
class ProductsController extends BaseController {
/**
* @var Model
*/
protected $model = Product::class;
/**
* @var array
*/
protected $requestArray = [
'store' => CreateProductRequest::class,
'update' => UpdateProductRequest::class
];
}
Z kolei klasy Requestowe mają te same metody do walidacji, jednak walidują różne pola, więc dla każdego kontrolera walidacja może przebiegać nieco inaczej. I tu pojawia się pytanie, powinienem testować jeden z dwóch kontrolerów (ponieważ faktyczna implementacja jest w BaseController)? Czy może powinienem testować każdy z osobna, czy losowo jeden z nich?