【问题标题】:How to access libraries inside a controller?如何访问控制器内的库?
【发布时间】:2012-01-22 20:33:30
【问题描述】:

我正在构建一个小型框架,可用于在未来的小型项目中重复平凡的事情。

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

不过,我觉得这有点难看。所以我想在每个控制器方法中根据每次使用单独加载每个类。

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

【问题讨论】:

    标签: php model-view-controller oop


    【解决方案1】:

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

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

    简单的示例,显然需要做很多工作才能使其可用(例如,需要自动加载和处理文件路径以方便使用,或者更简单地添加服务而不获取服务等)。

    【讨论】:

    • 这就是我最终的结果。但是语法似乎太长了,所以我只使用了一个带有静态数组的过程函数。
    【解决方案2】:

    我不喜欢 CodeIgniter 的做法。在我看来,它从来都不是正确的。我赞成将自动加载类推到 spl_autoload 堆栈上。然后像往常一样调用类:

    $class = new SomeClass();

    【讨论】:

    • 但是如果我需要同时在其他地方使用该类并且不想实例化它两次怎么办?我应该让我所有的图书馆单例吗?或者我应该创建一个函数来加载将静态数组分配给对象的类,然后如果它已经加载(CodeIgniter 的方法)就返回该对象?
    • @CrazeD 如果你需要的话,实现单例并没有错。
    【解决方案3】:

    PHP 通过SPLspl_autoload(以及相关函数)提供自动加载功能。您可以为您的库代码注册一个自定义自动加载器。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 2015-09-08
      • 2014-07-02
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多