我为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(不要重复自己)的原则。
所以这就是问题所在。这是最好的方法吗?
答案 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; ],
类在文件中定义。