Kry*_*ten 7 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";
...
Run Code Online (Sandbox Code Playgroud)
这些由(例如)一种date方法使用,该方法获取假日常数值和一年,并返回该年度假日期.我有一个外观和服务提供商设置,所以这个库可以在Laravel Way™中使用.一切都很完美,我对所有东西进行了单元测试,我对代码感到满意.
我的问题是如何引用这些常量.如果我使用外观并从代码的其他部分调用库,它看起来像这样:
$xmas = \Holidays::date(\MyApp\Libraries\Holidays::CHRISTMAS_DAY, "2014");
Run Code Online (Sandbox Code Playgroud)
它工作,但我更喜欢使用立面来做,像这样:
$xmas = \Holidays::date(\Holidays::CHRISTMAS_DAY, "2014");
Run Code Online (Sandbox Code Playgroud)
我想到的一个解决方案是在外观中定义常量.这是有效的,但后来我将常量值与库分开 - 出于显而易见的原因,我更愿意将值保存在与它们相关联的代码中.
然后,我找到了另一个解决方案:如上所述定义常量,然后在外观中引用它们,如下所示:
<?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;
...
Run Code Online (Sandbox Code Playgroud)
现在我可以通过facade来引用常量而不是完全限定的库类,我只需要为常量定义一次值(尽管我需要向库和外观添加任何新的常量).这是有效的,它让我得到了我想要的东西,但感觉有点像违反DRY(不要重复自己)的原则.
所以这就是问题所在.这是最好的方法吗?
您可以使用use别名来为您的\MyApp\Libraries\Holidays类添加别名,但不幸的是,使用Holidays会引发致命错误,因此我建议对其进行别名,Holiday这也可能会在将来为您节省一些混乱。
在声明类声明之前和声明命名空间之后添加...
use \MyApp\Libraries\Holidays as Holiday;
Run Code Online (Sandbox Code Playgroud)
像这样在你的班级中使用......
$xmas = \Holidays::date(Holiday::CHRISTMAS_DAY, "2014");
Run Code Online (Sandbox Code Playgroud)