2014-07-22 8 views
10

In PHP laravel, abbiamo codici comePerché utilizzare il metodo statico nella classe del modello laravel di PHP?

$user = User::find(1); 
var_dump($user->name); 

Non sto riguardo a come utilizzare il metodo find, sto per quanto riguarda il motivo per cui laravel utilizzare un metodo statico? L'uso del metodo statico non dovrebbe rendere difficile il test del metodo?

Sarà meglio se hanno progettato utilizzando singleton?

ad es.

$user = User::getInstance()->find(1); 
var_dump($user->name); 

risposta

2

Ciò limiterebbe il sistema dall'avere un solo utente. Mentre il metodo find può essere statico, la classe utente avrà altri metodi e proprietà che non sono, un esempio probabilmente è nel tuo esempio: $user->name

Un metodo che non si basa su alcuna variabile di istanza, variabili cioè chi il suo valore è specifico per la particolare istanza dell'oggetto, ma fornisce invece una funzionalità generica che si applica a tutte le istanze, può, e probabilmente dovrebbe, essere statica. Questo è il motivo per cui l'operatore $this è illegale all'interno dei metodi statici, in quanto non può fare riferimento a una particolare istanza di oggetto.

11

In realtà, il tuo esempio è molto simile a quello che fa Laravel dietro la scena. Quando si esegue User::find(), si richiede effettivamente una nuova istanza, un'istanza di Collection o QueryBuilder.

Illuminate \ Database \ Eloquente \ modello (reference):

public static function find($id, $columns = array('*')) 
{ 
    if (is_array($id) && empty($id)) return new Collection; 

    $instance = new static; 

    return $instance->newQuery()->find($id, $columns); 
} 

Come nota a margine, dove si può vedere un altro modo di usare metodi statici in laravel esempio Input::get(). Questi sono chiamati facciate.

facciate forniscono un'interfaccia "statica" per classi che sono disponibili nel contenitore CIO dell'applicazione ... laravel "facciate" servono come "proxy statico" ad sottostante classi nel contenitore CIO, fornendo il beneficio di un laconico sintassi espressiva pur mantenendo più testabilità e flessibilità rispetto ai metodi statici tradizionali.

Quando un utente fa riferimento a qualsiasi metodo statico su ... facade, Laravel risolve il binding della cache dal contenitore IoC ed esegue il metodo richiesto (in questo caso, get) su quell'oggetto.

Si può leggere di più su Facciate di Larave a: http://laravel.com/docs/facades

+0

'classe L'utente estende Illuminate \ Database \ Eloquent \ Model',' User' non è una classe di facciata – Razor

+1

Giusto, hai notato un errore enorme da parte mia. Modificata la mia risposta. – Unnawut

+0

Inoltre, le facciate (il modello di progettazione) non devono essere statiche. –

13

Unnawut ha una risposta molto buona, ma ho sentito la necessità di aggiungere in ulteriori spiegazioni.

Nel tuo esempio

$user = User::find(1); 
var_dump($user->name); 

laravel non utilizza un metodo statico, ci si trovi. Un altro modo per fare ciò che probabilmente stai cercando è di usare dependency injection, che Laravel rende molto facile perché può essere fatto automaticamente. Quindi, in qualsiasi classe tu stia utilizzando il tuo modello User, dovresti impostare qualcosa come questo nel costruttore ...

public function __construct(User $user) 
{ 
    $this->user = $user; 
} 

E quindi è possibile modificare il codice per non utilizzare i binding statici.

$user = $this->user->find(1); 
var_dump($user->name); 
+2

Whaaaat !! Possiamo farlo con tutte le facciate? Posso iniettare la facciata Mail e poi fare $ this-> mail-> send? * 0 * –

+0

Sì, puoi farlo con qualsiasi cosa. https://laravel.com/docs/5.1/container – user3158900

+1

Fantastico! Grazie! – mpemburn

-2

seguito l'oggetto GRASP patterns, l'utente non ha le conoscenze per poter cercare un utente.

È necessario un tipo di oggetto Filtro o Raccolta, il metodo ::find() consente di creare tale filtro Raccolta e trasmettere il risultato in un'entità utile.

Per gli usi dell'entità User, sarà sufficiente modificare il valore delle proprietà e recuperare i valori. L'entità non ha la responsabilità di cercare le istanze in base alle condizioni.

Con questa logica sarete in grado di disaccoppiare la logica nel codice in pezzi atomici.

Problemi correlati