Ho un paio di librerie definite per la mia applicazione Laravel che espongono costanti.Definizione delle costanti di classe nelle facciate
Ad esempio, ho una classe per calcolare giorni festivi e giorni lavorativi, utilizzata per contare il numero di giorni lavorativi per alcuni rapporti.
La mia definizione di classe si presenta così:
<?php namespace MyApp\Libraries;
/**
* The Holiday Calculation Helper Library
*
* A helper class to calculate holidays and working days.
*/
class Holidays {
/**
* The defined EBS holidays: New Years Day
*/
const NEW_YEARS_DAY = "new years day";
/**
* The defined EBS holidays: Independence Day
*/
const INDEPENDENCE_DAY = "independence day";
/**
* The defined EBS holidays: Christmas Day
*/
const CHRISTMAS_DAY = "christmas day";
...
questi sono utilizzati per (ad esempio) un metodo date
che assume il valore della costante di vacanza e un anno e restituisce la data di una vacanza in quell'anno. Ho una facciata e un provider di servizi impostati in modo tale libreria può essere utilizzata in The Laravel Way ™. Tutto funziona perfettamente, ho test di unità per tutto, e sono felice con il codice.
La domanda che ho è su come fare riferimento a queste costanti. Se sto usando la facciata e chiamando la biblioteca da altre parti del mio codice, sembra che questo:
$xmas = \Holidays::date(\MyApp\Libraries\Holidays::CHRISTMAS_DAY, "2014");
Funziona, ma io preferisco usare la facciata per farlo, in questo modo:
$xmas = \Holidays::date(\Holidays::CHRISTMAS_DAY, "2014");
Una soluzione a cui ho pensato è definire le costanti nella facciata. Funziona, ma poi separo i valori costanti dalla libreria: per ovvi motivi, preferirei mantenere i valori con il codice a cui sono associati.
Poi, mi ha colpito in un'altra soluzione: definire le costanti come sopra, poi fare riferimento nella facciata in questo modo:
<?php namespace MyApp\Facades;
use Illuminate\Support\Facades\Facade;
class Holidays extends Facade {
/**
* The defined EBS holidays: New Years Day
*/
const NEW_YEARS_DAY = \MyApp\Libraries\Holidays::NEW_YEARS_DAY;
/**
* The defined EBS holidays: Independence Day
*/
const INDEPENDENCE_DAY = \MyApp\Libraries\Holidays::INDEPENDENCE_DAY;
/**
* The defined EBS holidays: Christmas Day
*/
const CHRISTMAS_DAY = \MyApp\Libraries\Holidays::CHRISTMAS_DAY;
...
Ora posso fare riferimento alle costanti attraverso la facciata invece del completamente qualificato classe di libreria, e devo solo definire un valore per la costante una volta (anche se ho bisogno di aggiungere nuove costanti sia alla libreria che alla facciata). Funziona e mi fa ottenere ciò che voglio, ma mi sembra un po 'come una violazione del principio DRY (Do not Repeat Yourself).
Quindi, ecco la domanda. È questo il modo migliore per farlo?
ASCIUTTO o meno, il tuo metodo funziona e mi ha aiutato oggi. Suggerisco di pubblicare la tua soluzione come risposta, anche se non pensi che sia elegante. Finora è la soluzione migliore. –