rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » PHP

Zend框架2入门(四)


【本篇由趁霓虹灯未亮翻译自 Getting-Started-with-Zend-Framework-2.pdf版权归原作者所有】设置视图脚本
要融入视图到我们的应用程序,我们需要创建一些视图脚本文件。
我们需要通过应用模块的ViewListener对象执行,并通过控制器的变量来返回控制器方法。
这些视图脚本将被存储在我们模块的视图Views目录中。
现在创建以下空文件。
? modules/Album/views/album/index.phtml
? modules/Album/views/album/add.phtml
? modules/Album/views/album/edit.phtml
? modules/Album/views/album/delete.phtml现在我们可以开始一切了,从我们的数据库和模型model入手。
现在我们有一个相册模块设置了控制器方法和视图脚本。
是时候来看看应用程序的模型部分了。
请注意,这部分模型处理应用程序的核心目的(所谓的“业务规则”)是处理对应的数据库。
我们将使用Zend Framework的类的Zend\ DB \Table 来查找,插入,更新和删除从数据库表中的行。我们将使用MySQL,创建一个数据库称为zf2tutorial,并运行这些SQL语句
创建专辑表中的一些数据。

CREATE TABLE albums (
  id int(11) NOT NULL auto_increment,
  artist varchar(100) NOT NULL,
  title varchar(100) NOT NULL,
  PRIMARY KEY (id)
);
INSERT INTO albums (artist, title) VALUES ('Coldplay', 'Mylo Xyloto');
INSERT INTO albums (artist, title) VALUES ('Noel Gallagher', 'Noel Gallagher\'s High Flying Birds!');
INSERT INTO albums (artist, title) VALUES ('Adele', '21');
INSERT INTO albums (artist, title) VALUES ('Matt Cardle', 'Letters');
INSERT INTO albums (artist, title) VALUES ('Steps', 'The Ultimate Collection');

(测试数据的选择,恰好是在亚马逊英国的畅销产品,当我写了这一点!)
我们现在有一个数据库中的一些数据,并可以为它写一个非常简单的模型。
模型文件
Zend Framework不提供一个Zend\Model组件给你用于你的业务逻辑,因为这是由你来决定它该如何运作。有很多组件,您可以使用,这取决于您的需要。
一种方法是在应用程序中表示每个实体的模型类
然后使用映射器加载并保存到数据库中的实体的对象。
另一种是使用这样的学说或Propel的ORM。
在本教程中,我们要创建一个模型扩展 Zend\Db\Table\AbstracTable 还有Zend\Db\Table\Row。
这是一个表数据网关的设计模式,以便实施与数据库中的表数据接口。
请注意,虽然表数据网关模式可以进行更大的系统的限制。
还有一种诱惑,就是把数据库访问代码直接写到控制器动作中。
因为这些Zend\Db\Table\AbstracTable会暴露数据库,所以最好不要这么做!
像Zend\Db\Table\AbstracTable 是一个抽象类,
我们像这样在模块的模型Views目录创建我们自己的专辑类:
modules/Album/src/Album/Model/Albums.php:

<?php
namespace Album\Model;
use Zend\Db\Table\AbstractTable;class Albums extends AbstractTable
{
    protected $_name = 'albums';
    public function getAlbum($id)
    {
        $id = (int) $id;
        $row = $this->fetchRow('id = ' . $id);
        if (!$row) {
            throw new Exception("Could not find row $id");
        }
        return $row->toArray();
    }
    public function addAlbum($artist, $title)
    {
        $data = array(
            'artist' => $artist,
            'title' => $title,
        );
        $this->insert($data);
    }
    public function updateAlbum($id, $artist, $title)
    {
        $data = array(
            'artist' => $artist,
            'title' => $title,
        );
        $this->update($data, 'id = ' . (int) $id);
    }
    public function deleteAlbum($id)
    {
        $this->delete('id =' . (int) $id);
    }
}
?>


我们已经建立了四个辅助方法,我们的应用程序将使用界面到数据库表。
getAlbum()检索一个数组中的单个行,
addAlbum()创建一个数据库中的新行,
updateAlbum()更新专辑行
deleteAlbum()完全删除行。
这些方法中的代码是不言自明。
使用DI配置数据库的凭据,并注入到控制器
为了使用我们的模型类,在我们的控制器
我们可以采取的调度使用依赖注入容器的定位和实例化我们的控制器类的优势。
这意味着我们可以使用的DI容器
创建我们的AlbumsTable类的一个实例,它注入我们的控制器。
凭借此作品的方式,
当实例化的AlbumsTable类,
我们也可以告诉DI容器如何连接到数据库。
这意味着,我们可以清楚地说明我们的数据库是如何连接到我们的模型
以及如何连接到我们的模型是我们的控制器在我们的module.config.php文件,这将会使维护更容易,如果我们需要改变它。
我们开始提供DI容器可以使用它注入AlbumsTable的方法在我们的控制器。
这就是所谓的setAlbumsTable(),所以现在它添加。
AlbumController现在看起来像这样:
modules/Album/src/Album/AlbumController.php:

<?php
namespace Album\Controller;
use Zend\Mvc\Controller\ActionController,
    Album\Model\Albums;
class AlbumController extends ActionController
{
    protected $albums;
    public function indexAction()
    {    }
    public function addAction()
    {    }
    public function editAction()
    {    }
    public function deleteAction()
    {    }    public function setAlbums(Albums $albums)
    {
        $this->albums = $albums;
        return $this;
    }
}
?>


正如你可以看到,我们增加了一种新的方法,setAlbums(),
设置$专辑受保护的属性我们也更新了使用列表使PHP知道我们的相册类。
现在有一种方法来设置 Album\Model\Albums 的一个实例内AlbumController,
我们现在可以告知DI容器需要做什么,以便它可以调用我们setAlbums()。
这样做是在“DI”module.config.php节。
更新下列变更module.config.php
modules/Album/configs/module.config.php:

<?php
$default = array(
    'di' => array('instance' => array(
            'alias' => array(                'album' => 'Album\Controller\AlbumController',
            ),
            'Album\Controller\AlbumController' => array(
                'parameters' => array(
                    'albums' => 'Album\Model\Albums',
                ),
            ),
            'Album\Model\Albums' => array(
                'parameters' => array(
                    'config' => 'Zend\Db\Adapter\Mysqli',
            )),
            'Zend\Db\Adapter\Mysqli' => array(
                'parameters' => array(
                    'config' => array(
                        'host' => 'localhost',
                        'username' => 'rob',
                        'password' => '123456',
                        'dbname' => 'zf2tutorial',
                    ),
                ),
            ),
            'Zend\View\PhpRenderer' => array(
                'parameters' => array(
                    'resolver' => 'Zend\View\TemplatePathStack',
                    'options' => array(
                        'script_paths' => array(
                            'Album' => __DIR__ . '/../views',
                        ),
                    ),
                ),
            ),
    )),
);
// published environments
$production = $default;
$staging = $default;
$testing = $default;
$development = $default;
$config = compact('production', 'staging', 'testing', 'development');
return $config;
?>


让我们看看这改变的细节:

<?php
           'Album\Controller\AlbumController' => array(
                'parameters' => array(
                    'albums' => 'Album\Model\Albums',
                ),
            ),
?>

【本篇由趁霓虹灯未亮翻译自 Getting-Started-with-Zend-Framework-2.pdf版权归原作者所有】
顶一下
(0)
踩一下
(0)