Il modello eloquente autocosciente implementa il modello di strategia

4

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?

  1. È questo il modello della strategia (modificato)? È questo un altro modello?
  2. 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?
posta MECU 04.01.2018 - 22:44
fonte

1 risposta

2

Non è il modello di strategia - se è un modello di strategia modificato dipende da quanto lontano vuoi allungare. Non sono sicuro che questo approccio abbia un nome, perché non puoi farlo (esattamente) nella maggior parte delle altre lingue. Il campo $company dovrebbe essere una sorta di metodo factory in C # / Java / C ++.

Non ho fatto alcuna programmazione PHP in un tempo lungo , quindi non sono la persona migliore per chiedere le migliori pratiche. Al momento non riesco davvero a capire perché non dovresti usare questa capacità di PHP, se ti aiuta davvero.

Tuttavia, non riesco davvero a capire perché, in primo luogo, dovresti avvolgere la creazione dell'API in questo modo. Sembra che Property::find($x) possa semplicemente restituire direttamente un'istanza di API .

Se hai bisogno della classe Property per fornire funzionalità aggiuntive, puoi inserire direttamente l'oggetto API , invece di crearlo con Property .

    
risposta data 04.01.2018 - 23:57
fonte

Leggi altre domande sui tag