2014-04-28 6 views
6

Ich habe ein paar Bibliotheken für meine Laravel-Anwendung definiert, die Konstanten freilegen.Definieren von Klassenkonstanten in Fassaden

Zum Beispiel habe ich eine Klasse für die Berechnung von Feiertagen und Arbeitstagen, die zum Zählen der Anzahl der Arbeitstage für einige Berichte verwendet wird.

Meine Klassendefinition sieht wie folgt aus:

<?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"; 

    ... 

Diese werden verwendet, von (zum Beispiel) ein date Methode, die den Feiertags konstanten Wert und ein Jahr dauert und gibt das Datum der Urlaub in diesem Jahr. Ich habe eine Fassade und einen Dienstleister eingerichtet, so dass diese Bibliothek in The Laravel Way ™ verwendet werden kann. Alles funktioniert perfekt, ich habe Komponententests für alles, und ich bin glücklich mit dem Code.

Die Frage, die ich habe, ist, wie man sich auf diese Konstanten bezieht. Wenn ich die Fassade mit und die Bibliothek aus anderen Teilen meines Code aufrufen, sieht es wie folgt aus:

$xmas = \Holidays::date(\MyApp\Libraries\Holidays::CHRISTMAS_DAY, "2014"); 

Es funktioniert, aber ich würde es vorziehen, die Fassade zu verwenden, es zu tun, wie folgt aus:

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

Eine Lösung, an die ich gedacht habe, ist die Definition der Konstanten in der Fassade. Das funktioniert, aber ich teile die konstanten Werte von der Bibliothek - aus offensichtlichen Gründen würde ich es vorziehen, die Werte mit dem Code zu behalten, mit dem sie verknüpft sind.

Dann traf ich auf eine andere Lösung: wie oben die Konstanten definieren und sie dann in der Fassade verweisen etwa so:

<?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; 

    ... 

Jetzt kann ich auf die Konstanten durch die Fassade verweisen anstelle des vollqualifizierten Bibliotheksklasse, und ich muss nur einmal einen Wert für die Konstante definieren (obwohl ich sowohl der Bibliothek als auch der Fassade neue Konstanten hinzufügen muss). Das funktioniert, und es bringt mich, was ich will, aber es fühlt sich ein wenig wie eine Verletzung des DRY (Do not Repeat Yourself) Prinzips an.

Also hier ist die Frage. Ist dies der beste Weg, dies zu tun?

+0

TROCKEN oder nicht, Ihre Methode funktioniert und hat mir heute geholfen. Ich schlage vor, Ihre eigene Lösung als Antwort zu veröffentlichen, auch wenn Sie nicht denken, dass es elegant ist. Bis jetzt ist es die beste Lösung. –

Antwort

1

können Sie use verwenden Ihre \MyApp\Libraries\Holidays Klasse alias, aber leider wird Holidays mit einem fatalen Fehler werfen, würde ich so deuten darauf hin, es als Holiday Aliasing, die auch Sie einige Verwirrung in die Zukunft retten können.

hinzufügen, bevor Sie Ihre Klassendeklaration erklären und nachdem Sie Ihren Namensraum deklarieren ...

use \MyApp\Libraries\Holidays as Holiday; 

Verwendung in Ihrer Klasse wie so ....

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

Danke für den Vorschlag. Ich denke, eine bessere Wahl wäre, es mit einem Namen zu versehen, der der ursprünglichen Klasse nicht so nahe kommt - 'Holiday' vs.' Holidays' wird mich wahrscheinlich durcheinander bringen :-) Vielleicht 'Holidays' und' HolidayList'. – Kryten

0

Die Art, wie ich über das Laden gehen Konstanten, ist es, die Datei zu "Classmap" -Direktive in composer.json

hinzufügen Für z (Das gleiche wie ich verwende) "classmap": [ "Datenbank", "app/RolfK/constants.php" ],

Klasse ist in der Datei definiert.

Verwandte Themen