Mi piacerebbe avere un modello (Eloquent) che implementa una classe basata su una proprietà del modello una volta creata. Penso che questo sia il modello di strategia, ma dal momento che lo sto facendo da dentro un modello e non passando la dipendenza, non è la soluzione perfetta. Sto cercando di evitare l'uso di switch o if-else per creare le API CompanyXXX
, perché attualmente c'è il 4% diCompanyXXX
, ed è già ingombrante e potremmo avere fino a 20 in pochi anni.
Esempio:
interface API
{
public function getThings();
}
class CompanyOne implements API
{
public function getThings()
{
// Company One API specific stuff to get Things
}
}
class Property extends Model
{
// This is an Eloquent Model, this valid is populated from the DB
public $company; // 'CompanyOne'
// This is the class implementing the API to use based upon $company
private $api;
public function __construct()
{
parent::__construct();
$this->api = new $this->company;
// Thus, this is an object CompanyOne
}
public function getThings()
{
$this->api->getThings();
// CompanyXXX API specific stuff to getThings
}
}
Quindi, sarei in grado di fare cose come questa in un controller in modo che sappia quale API usare (basata su $ api) e lo fa semplicemente ™. Non ho bisogno di sapere o preoccuparmi dell'API utilizzata da questa proprietà, ho solo bisogno di getThings.
$property = Property::find(1); // get from DB, has 'api' parameter set
$things = $property->getThings();
Che è molto più semplice rispetto ai metodi attuali che usano lo switch e ora sono difficili da mantenere (ora abbiamo 46 istruzioni switch nella base del codice):
$property = Property::find(1);
switch ($property->api) {
case 'CompanyOne':
$api = new CompanyOne;
case 'CompanyTwo':
$api = new CompanyTwo;
// repeat
}
$things = $api->getThings();
Quindi qual è la domanda?
- È questo il modello della strategia (modificato)? È questo un altro modello?
- Esiste un modo migliore (specialmente in Laravel) di avere più classi API (come nel mio esempio) determinate dal parametro di un modello che è 'self-aware' per implementare la classe / il sistema corretto per ridurre l'uso di passare e le dichiarazioni if-else?