如何访问控制器内的库?

时间:2011-12-18 00:36:38

标签: php model-view-controller oop

我正在构建一个小框架,我可以在未来的小项目中使用它来反复平凡的事情。

我坚持从控制器内部访问库的最佳方法。我最初实现了一个类似于CodeIgniter的系统,我的主控制器类基本上是一个超级对象,并将所有类加载到类变量中,然后通过扩展控制器并像$this->class->method()

那样进行访问。 但是,我觉得有点难看。所以我想在每个控制器方法中按每次使用单独加载每个类。

这样做最好(最干净)的方法是什么?

3 个答案:

答案 0 :(得分:2)

我不喜欢CodeIgniter这样做的方式。它对我来说似乎永远不对。我赞成将一个自动加载类推入spl_autoload堆栈。然后像正常一样调用类:

$class = new SomeClass();

答案 1 :(得分:2)

PHP使用SPLspl_autoload(以及相关功能)提供自动加载功能。您可以为库代码注册自定义自动加载器。

对于应用程序处理的共享功能,您是否考虑过Front Controller design pattern

答案 2 :(得分:2)

要只有每个类的一个实例,您可以创建一个简单的服务容器。

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);
}

简单的例子,显然需要大量工作才能使用(例如需要自动加载和处理文件路径以便于使用,或者更容易添加服务而不获取它们等)。