2011-12-18 92 views
2

我正在构建一个小型框架,我可以将它用于未来小型项目的重复世俗的东西。如何访问控制器内的库?

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

我发现有点难看。所以我想到了在每个控制器方法中,按照每个使用的情况逐个加载每个类。

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

回答

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

简单的例子,显然需要大量的工作,使可用(例如自动加载需要和处理的文件路径的易用性,或者更简单的方法来添加服务没有得到他们等)。

+0

这就是我最终的目标。但是这个语法看起来太长了,所以我只是用一个静态数组来处理一个过程函数。 – CrazeD 2011-12-18 03:00:57

2

我不喜欢CodeIgniter的做法。它从来没有像我这样做。我喜欢将自动加载类压入spl_autoload栈。然后只需调用类为正常,如:

$class = new SomeClass();

+0

但是如果我需要在别的地方同时使用这个类而又不想实例化它呢?我应该只是让我所有的图书馆单身?或者我应该创建一个函数来加载为对象分配一个静态数组的类,然后如果它已经被加载(CodeIgniter的方法)就返回对象? – CrazeD 2011-12-18 00:54:13

+1

@CrazeD如果这是你需要的,那么实现单例没有什么错误。 – kba 2011-12-18 01:03:19