2014-04-28 13 views
6

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?

+0

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. –

risposta

1

È possibile utilizzare use per alias la classe \MyApp\Libraries\Holidays, ma purtroppo, utilizzando Holidays getterà un errore fatale, così io suggerirei aliasing come Holiday che può anche risparmiare un po 'di confusione in futuro.

Aggiungere prima di dichiarare la vostra dichiarazione di classe e dopo si dichiara lo spazio dei nomi ...

use \MyApp\Libraries\Holidays as Holiday; 

Uso dentro la classe in questo modo ....

$xmas = \Holidays::date(Holiday::CHRISTMAS_DAY, "2014"); 
+0

Grazie per il suggerimento. Penso che una scelta migliore potrebbe essere quella di nominarlo con un nome che non è così vicino alla classe originale - 'Holiday' vs.' Holidays' probabilmente mi incasinerà :-) Forse 'Holidays' e' HolidayList'. – Kryten

0

Il modo in cui vado sul caricamento costanti, è quello di aggiungere il file alla direttiva "classmap" in composit.json

Per es. (Lo stesso che uso io) "classmap": [ "database", "app/RolfK/constants.php" ],

classe è definita nel file.

Problemi correlati