Archive for the 'zend framework 2' Category

理解依赖注入 for Zend framework 2

依赖注入(Dependency Injection),也称为控制反转(Inversion of Control),一种设计模式,其目的是解除类之间的依赖关系。

假设我们需要举办一个Party,Party需要主持人、厨师、灯光、音响、食品、酒水等等。那么Party对他们存在依赖关系。用程序语言表示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Party.php
class Party{
    //主持人
    private $_host;
 
    function __construct(){
        include "./Host.php";
        $this->_host = new Host();
    }
 
    function startParty(){
        $this->_host->sayHello();
    }
}
 
//Host.php
class Host{
    private $_name;
    function sayHello(){
        echo "My name is " . $this->_name;
    }
}
 
//main
$party = new Party();
$party->startParty();

可见Party的运行依赖于Host,没有Host,Party不能单独运行,也不能单独发布为组件。为了解除Party对Host的依赖,我们可以这么做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//Party.php
class Party{
    //主持人
    private $_host;
 
    function __construct($host = ""){
        if($host){
            $this->_host = $host;
        }
    }
 
    function startParty(){
        $this->_host->sayHello();
    }
 
    function setHost($host){
        $this->_host = $host;
    }
}
 
//Host.php
class Host{
    private $_name;
    function sayHello(){
        echo "My name is " . $this->_name;
    }
}
 
//main
$host = new Host();
$party = new Party();
$party->setHost($host);//或者 $party = new Party($host)
$party->startParty();

此时Party类对Host类的依赖被移到外面,运行时Host类通过构造函数或者setter注入到Party中。Party本身可以被单独发布。如果Host没有sayHello方法,将其注入到Party中必然导致异常。为了约束Host必须含有sayHello方法,可以使用接口。
继续阅读 [ 理解依赖注入 for Zend framework 2 ]

Zend Framework 2 事件驱动编程的理解

利用程序解决一个问题时,我们通常会确定各个步骤以及步骤的顺序,这就是面向过程编程;而面向对象编程在解决问题的逻辑上仍然是过程化的。为了使步骤之间能够连贯执行,我们需要函数之间的来回调用,使得各函数之间形成依赖。事件驱动编程能够解耦这种依赖关系。

如果完成一件事分为A、B、C三个步骤(函数),A做完了调用B,B做完了调用C,事情结束了。事件驱动编程不需要A、B、C之间的调用,加入一个事件管理器(EventManager,简称EM),A通知EM我做完了(AFinished事件被EM抛出),此时A就不管了,你们谁接着执行跟我没关了。如果B要在A完成后执行,B就可以预先告诉EM,如果A做完了我做(即将B绑定到AFinished事件)。这样A与B之间的关系是由EM控制的,而不需要A、B之间互相调用。
继续阅读 [ Zend Framework 2 事件驱动编程的理解 ]

Zend Framework 2中如何使用Service Manager

Zend Framework 2 使用ServiceManager(简称SM)来实现控制反转(IoC)。有很多资料介绍了service managers的背景,我推荐大家看看this blog post from Evanthis post from Reese Wilson,但是仍然有很多开发者不能够很好地使用ServiceManager去解决他们的需求。这篇文章我将解释为什么ZF2框架需要使用多个服务管理器以及怎样使用它们。主要包含以下几个方面:

  1. 这些不同的服务管理器是什么?
  2. 不同的服务管理器用来干什么?
  3. 服务管理器与服务定位器是什么关系?
  4. 如何使用这些服务管理器定义服务?
  5. 如何在一个服务管理器中通过另一个服务管理器调用服务?

服务管理器使用在ZF2的许多地方,其中最重要的四个地方是:

  1. 应用全局服务管理(根服务管理器或者说是主要服务管理器)
  2. 控制器
  3. 控制器插件
  4. 视图助手

继续阅读 [ Zend Framework 2中如何使用Service Manager ]