在PHP MVC应用程序中实现模块系统的最佳方法


Best way to implement module system in PHP MVC App?

我目前正在开发自己的PHP MVC框架。这个应用程序是用于个人目的的,可能有一天会发布开源版本。我在应用程序中实现了一个模块系统。例如,核心将运行,用户安装"艺术家"模块(由实体,模型和控制器组成)用户将能够更新模板。所以在某一时刻,他会这样写:$ this ->应用()-> getModule('艺术家')-> getAll ();

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

Call to a member function getProperty() on null

脚本将停止。有什么方法可以消除这个错误吗?我知道魔法调用,但我不知道如何级联它,

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

将停止并返回例如"Module desactivated",而不是试图到达不存在的实体和模型。

谢谢!

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

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

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

因此,加载的模块将用NullModule替换艺术家模块,并且在调用$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对象的优点是,您只需要检查模块是否在几个地方处于活动状态,而更通用的代码不需要检查任何东西。它可以像一个"真正的"模块一样工作。

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