我正在构建一个小型框架,我可以将它用于未来小型项目的重复世俗的东西。如何访问控制器内的库?
我被困在从控制器内部访问库的最佳方式。我最初实现了一个类似于CodeIgniter的系统,其中我的主控制器类基本上是一个超级对象,并将所有类加载到类变量中,然后通过扩展控制器来访问,然后像$this->class->method()
我发现有点难看。所以我想到了在每个控制器方法中,按照每个使用的情况逐个加载每个类。
这样做最好(最干净)的方式是什么?
我正在构建一个小型框架,我可以将它用于未来小型项目的重复世俗的东西。如何访问控制器内的库?
我被困在从控制器内部访问库的最佳方式。我最初实现了一个类似于CodeIgniter的系统,其中我的主控制器类基本上是一个超级对象,并将所有类加载到类变量中,然后通过扩展控制器来访问,然后像$this->class->method()
我发现有点难看。所以我想到了在每个控制器方法中,按照每个使用的情况逐个加载每个类。
这样做最好(最干净)的方式是什么?
为了每个类只有一个实例,您可以创建一个简单的服务容器。
class ServiceContainer
{
protected $services;
public function get($className)
{
if (!array_key_exists($className, $this->services)) {
$this->services[$className] = new $className;
}
return $this->services[$className]
}
}
然后为每个应用程序创建一个ServiceContainer实例。注入容器到所有的控制器,并使用
public function someAction()
{
$this->container->get('Mailer')->send($email_data);
}
简单的例子,显然需要大量的工作,使可用(例如自动加载需要和处理的文件路径的易用性,或者更简单的方法来添加服务没有得到他们等)。
PHP提供了自动载入功能与SPL和spl_autoload(以及相关的功能)。您可以为您的库代码注册自定义自动加载器。
对于您的应用程序处理的共享功能,您是否考虑过Front Controller design pattern?
这就是我最终的目标。但是这个语法看起来太长了,所以我只是用一个静态数组来处理一个过程函数。 – CrazeD 2011-12-18 03:00:57