在PHP MVC App中实现模块系统的最佳方法?

时间:2015-06-07 15:25:02

标签: php oop

我目前正在开发自己的PHP MVC框架。 此应用程序是出于个人目的,可能每天发布开源。 我正在应用程序中实现模块系统。 例如,Core将运行,并且用户将安装"艺术家"模块(由实体,模型和控制器组成) 用户将能够更新模板。 所以在某个时刻,他将以写作为例: $这 - >应用程序() - > getModule('艺术家') - > GETALL();

如果由于某些原因,管理员禁用"艺术家"模块,前端将显示:

Call to a member function getProperty() on null

脚本将停止。 有没有办法沉默这个错误? 我知道魔法召唤,但我不知道如何级联它,

$this->app()->getModule(string)

将停止并返回例如"模块已停用"而不是尝试到达不存在的实体和模型。

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为一个好的,明确的方法就是检查模块是否在那里。您可以检查空值,如下所示:

$artistModule = $this->app()->getModule('Artist');
if ($artistModule)
  $artists = $artistModule->getAll();

但是在某些情况下可能有用的另一种模式是NULL对象。这实际上是一个空实现的替换对象。因此对于模块,它可以实现基本方法,如get(),getCount()和getAll()(或其他方法),并返回默认值,如计数为0,getAll为空数组。

因此,加载的模块将使用NullModule替换artist模块,并且在调用$this->getModule('artist')->getAll()时,您将获得一个空数组而不是艺术家列表。

$artists = $this->app()->getModule('Artist')->getAll() ;

但是,如果模块有任何方法可以明确检查它是否处于活动状态,那将是一个好主意,因此程序员至少可以在需要时进行检查。这样的函数,比如说getActive()只能在NullModule中返回false,所以第一个片段可以重写为:

$artistModule = $this->app()->getModule('Artist');
// $artistModule will be a NullModule instance if Artist is disabled.
if ($artistModule->isActive())
  $artists = $artistModule->getAll();

Null Objects的优势在于,您只需检查几个位置处于活动状态的模块,而更通用的代码不需要检查任何内容。它可以像真正的“真实”一样发挥作用。模块。

但这也可能是一个缺点。如果你没有正确检查,你的代码似乎可以正常运行,而实际上它根本不应该运行。

请参阅Null Object pattern on Wikipedia

相关问题