在外墙中定义类常量

时间:2014-04-28 15:39:48

标签: php laravel laravel-4

我为Laravel应用程序定义了几个库,它们暴露了常量。

例如,我有一个用于计算假期和工作日的课程,用于计算某些报告的工作日数。

我的班级定义如下:

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

    ...

这些用于(例如)date方法,该方法获取假日常数值和年份,并返回该年度假日期。我有一个外观和服务提供商设置,所以这个库可以在 The Laravel Way™中使用。一切都很完美,我对所有内容进行了单元测试,我对代码感到满意

我的问题是如何引用这些常量。如果我使用外观并从代码的其他部分调用库,它看起来像这样:

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

它有效,但我更喜欢使用立面来做这件事:

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

我想到的一个解决方案是在外观中定义常量。这是有效的,但是我将常量值与库分开 - 出于显而易见的原因,我更愿意将这些值与他们所关联的代码保持一致。

然后,我找到了另一个解决方案:如上所述定义常量,然后在外观中引用它们,如下所示:

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

    ...

现在我可以通过facade来引用常量而不是完全限定的库类,我只需要为常量定义一次值(尽管我需要向库中添加任何新的常量和正面)。这是有效的,它让我得到了我想要的东西,但感觉有点像违反DRY(不要重复自己)的原则。

所以这就是问题所在。这是最好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用use为您的\MyApp\Libraries\Holidays类别名,但不幸的是,使用Holidays会产生致命错误,所以我建议将其别名为Holiday也可能在将来为您节省一些困惑。

在声明类声明之前和声明命名空间之后添加...

use \MyApp\Libraries\Holidays as Holiday;

在课堂内使用,就像这样......

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

答案 1 :(得分:0)

我加载常量的方法是将文件添加到&#34; classmap&#34; composer.json中的指令

例如(和我一样) &#34; classmap &#34;:[             &#34;数据库&#34 ;,             &#34;应用程序/ RolfK / Constants.php&#34;         ],

类在文件中定义。