Mentre guardando il sorgente laravel, ho notato un sacco di cose come questa:Qual è lo schema del tratto Laravel?
Una classe controller:
class Controller extends BaseController
{
use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;
}
Uno dei suoi tratti componenti:
trait AuthorizesRequests {
/**
* Authorize a given action against a set of arguments.
*
* @param mixed $ability
* @param mixed|array $arguments
*
* @return \Illuminate\Auth\Access\Response
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function authorize($ability, $arguments = []) {
list($ability, $arguments) = $this->parseAbilityAndArguments($ability, $arguments);
return app(Gate::class)->authorize($ability, $arguments);
}
// ...
}
Ho un paio di domande a riguardo:
- Questo modello (l'astrazione di funzionalità riutilizzabili in tratti) ha un nome?
- Questo pattern è utilizzato con buoni risultati in altri progetti?
- Se un tratto richiede dipendenze, esiste un modo migliore per iniettarle, invece di utilizzare un localizzatore di servizio (come
app()
, in questo caso)?
Sto pensando di utilizzare questo approccio nel mio codice per condividere alcune funzionalità generale tra un paio delle mie classi - che sto pensando di creare un tratto ChecksBarcodes
, che lavorerà con un repository di informazioni di borsa, e condivisione che tratto tra alcune classi di processo di gestione prodotto simili ma non correlate, che devono tutte controllare i codici a barre.
Cosa ne pensi di passare una dipendenza dalla classe alla caratteristica attraverso la funzione chiamata stessa? '$ this-> checkBarcode ($ dependency, $ barcode);' Sembra un'altra possibilità, ma piuttosto sfacciata. Sei d'accordo? – Alex
Sì, mi sembra meno utile. Se lo fai in questo modo, ogni classe che eredita il tratto deve comunque avere la dipendenza iniettata manualmente, vanificando lo scopo di estrarre comportamenti ripetuti. – Jeff
Grazie mille per i tuoi pensieri Jeff. @codedge e hai entrambi risposto a parti separate della domanda, quindi se potessi accettare entrambe le risposte lo farei! Hanno scelto di accettare l'altra risposta in quanto si riferisce più strettamente al titolo generale della domanda rispetto alla discussione sulla dipendenza. – Alex