Zend Framework 1 – Quick Start

创建 Zend 项目

要成立 Zend 项目,首先要下载并解压 Zend Framework。

安装 Zend Framework

下载最新的 Zend Framework 1.12.20
源码包
,(我们运用的是
Zend Framework 1,所以下面的始末都是基于 Zend 1)

解压到合适的地方(比如:/home/xxx/bin/).

注: /home/xxx/bin
是本人偏爱的目录,尽管您设定了和睦的目录,就应该替换下边发号施令中相应的地点

$ tar -xzvf ZendFramework-1.12.20.tar.gz -C /home/xxx/bin

如此这般 Zend Framework 就设置在了 /home/xxx/bin/ZendFramework-1.12.20

注1:Zend Framework
各样版本下载

注2:$ 符号表示方今条件是 Linux 命令行终端,在伺机输入一个人命令。

创设项目

在 Zend 安装目录下的 bin/ 目录下有 zf.sh
脚本文件,你需要在系统path目录下开创该公文的链接,然后就可以在指令行中任何地点接纳zf命令创制项目了。

$ sudo ln -s /home/xxx/bin/ZendFramework-1.12.20/bin/zf.sh /usr/local/bin/zf

打开命令行(Ctrl + Alt + T),切换来您想创制项目标岗位,如果你想在 ~/demo/
目录下创办 Zend 项目:cd ~/demo/

施行下面的授命创设 quickstart 项目:

$ zf create project quickstart

这般就成立了 /home/xxx/demo/quickstart,并且在 quickstart
目录下活动创造了 Zend 项目标一对索引结构。其品种社团如下:

quickstart
|-- application
|   |-- Bootstrap.php
|   |-- configs
|   |   `-- application.ini
|   |-- controllers
|   |   |-- ErrorController.php
|   |   `-- IndexController.php
|   |-- models
|   `-- views
|       |-- helpers
|       `-- scripts
|           |-- error
|           |   `-- error.phtml
|           `-- index
|               `-- index.phtml
|-- library
|-- public
|   |-- .htaccess
|   `-- index.php
`-- tests
    |-- application
    |   `-- bootstrap.php
    |-- library
    |   `-- bootstrap.php
    `-- phpunit.xml

这会儿,只是创造了 Zend 项目结构,你还索要把 Zend Framework 添加到
quickstart 项目中,有三种艺术,一中是创立一个链接,把 zend 框架下的
library 目录链接到 quickstart/library ,另一种方法是一向复制 zend
框架下的 library 目录替换掉 quickstart/library。

# Symlink
$ cd library
$ ln -s /home/xxx/bin/ZendFramework-1.12.20/library/Zend .

# or copy
$ cd library
$ cp -r /home/xxx/bin/ZendFramework-1.12.20/library/Zend .

这么就可以见到 quickstart/library/Zend 目录了。

品种启动文件

Bootstrap 类定义了 Zend 项目启动时要初阶化的资源和组件。默认地,Zend
Framework 开头化了 Front Controller,然后它应用 application/controllers/
作为寻找 action controller 的默认路径。那么些类如下:

// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
}

如你所见,这中间没有什么内容。

项目布局文件

默认配置文件放在:application/configs/application.ini,包含部分着力的授命,比如设置php环境,设置启动类,设置
action controller 等。文件内容如下:

; application/configs/application.ini

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

至于这些文件有几个要点:

(1) 使用 ini 配置文件时,你可以间接引用常量,APPLICATION_PATH
就是一个常量。

(2) 这个文件被分成多少个部分:production,staging,testing 和
development。后边两个包括了 production
的装置。不同的条件其安排分开,这样有利于开发和调试。

Action Controller 控制器

应用程序的 action controller 定义了程序流程,把用户请求映射到适当的
model 和 view。

一个 action controller
应包含一个或两个以Action说到底的法门,这一个艺术可以因而 web
请求访问到。默认地,Zend Framework URLs 遵循 /controller/action
的形式,其中 controller 就映射 action controller
名字(以Controller作为后缀),而 action 就映射到 action
方法(以Action作为后缀)。

层见迭出,需要一个 IndexController,它代表网站首页,和一个
ErrorController,它表示诸如 HTTP404、HTTP500 等不当页面.

开始 IndexController 代码如下:

// application/controllers/IndexController.php

class IndexController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        // action body
    }
}

开始 ErrorController 代码如下:

// application/controllers/ErrorController.php

class ErrorController extends Zend_Controller_Action
{

    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:

                // 404 error -- controller or action not found
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                // application error
                $this->getResponse()->setHttpResponseCode(500);
                $this->view->message = 'Application error';
                break;
        }

        $this->view->exception = $errors->exception;
        $this->view->request   = $errors->request;
    }
}

Views 视图

Zend Framework 中的 Views 是用一般 PHP 代码写的。View scripts 在
application/views/scripts/
下边,它以控制器名字分文件夹社团起来。本例中,我们有一个 IndexController
和 ErrorController,因而相应地,也应在 View scripts 目录下有 index/ 和
error/ 子目录。在这一个子目录中,又有各样 view scripts 文件,对应
Controller 中的 Action。本例中,使用 index/index.phtml 和
error/error.phtml。

下面是默认的 index/index.phtml view script:

<!-- application/views/scripts/index/index.phtml -->
<style>

    a:link,
    a:visited
    {
        color: #0398CA;
    }

    span#zf-name
    {
        color: #91BE3F;
    }

    div#welcome
    {
        color: #FFFFFF;
        background-image: url(http://framework.zend.comkg_header.jpg);
        width:  600px;
        height: 400px;
        border: 2px solid #444444;
        overflow: hidden;
        text-align: center;
    }

    div#more-information
    {
        background-image: url(http://framework.zend.comkg_body-bottom.gif);
        height: 100%;
    }

</style>
<div id="welcome">
    <h1>Welcome to the Zend Framework!<h1 />
    <h3>This is your project's main page<h3 />
    <div id="more-information">
        <p>
            <img src="http://framework.zend.comPoweredBy_ZF_4LightBG.png" />
        </p>

        <p>
            Helpful Links: <br />
            <a href="http://framework.zend.com/">Zend Framework Website</a> |
            <a href="http://framework.zend.com/manual/en/">Zend Framework
                Manual</a>
        </p>
    </div>
</div>

error/error.phtml 稍微复杂一点,其中使用了php条件语句:

<!-- application/views/scripts/error/error.phtml -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Zend Framework Default Application</title>
</head>
<body>
  <h1>An error occurred</h1>
  <h2><?php echo $this->message ?></h2>

  <?php if ('development' == $this->env): ?>

  <h3>Exception information:</h3>
  <p>
      <b>Message:</b> <?php echo $this->exception->getMessage() ?>
  </p>

  <h3>Stack trace:</h3>
  <pre><?php echo $this->exception->getTraceAsString() ?>
  </pre>

  <h3>Request Parameters:</h3>
  <pre><?php echo var_export($this->request->getParams(), 1) ?>
  </pre>
  <?php endif ?>

</body>
</html>

创建虚拟主机

对于 quickstart 项目,大家把它坐落 apache 服务器上运行。

俺们需要设置一个虚拟主机,这样就足以在浏览器中输入域名来访问我们的网站了。假使你曾经配备好了
php+apache+mysql
运行环境,假若没有,请参考教程

一旦我们的类型所映射的域名是:quickstart.local。

跻身 apache 配置目录,创立布局文件:

cd /etc/apache2/sites-available/
sudo gedit quickstart.local.conf

接下来复制下边的始末到该配置文件,注意:项目路线需要替换成你协调的品类路线:

<VirtualHost *:80>
    ServerName quickstart.local

    ServerAdmin webmaster@localhost
    DocumentRoot /home/xxx/demo/quickstart/public

    <Directory /home/xxx/demo/quickstart/public>
    AllowOverride all
    require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

保存该文件,并且启用该配置:sudo a2ensite quickstart.local

下一场打开hosts文件:sudo gedit /etc/hosts 添加一行:
127.0.0.1 quickstart.local

说到底重启一下 apache 服务器:
sudo service apache2 restart

到此为止,这一个连串就创办成功还要可运行了。

查查成果

现行就可以访问你的档次网站了,打开浏览器输入http://quickstart.local,就能收看欢迎页了。
Bootstrap 1

恐怕遭逢的题材:

  1. 页面不出示:很有可能时项目目录的权力问题,使用
    chmod -R 777 /home/xxx/demo/quickstart 试试看。

开创一个 Layout

您或许注意到,下面的 view scripts 不是共同体的 html
页面,这是有意设计的。大家只想让 action 只回去 action
本身要出口的内容,而不是全体应用程序页面。

现在来组合一个完整的 HTML 页面。我们应用一个大局的 layout
来作为网站联合的体裁。

注: 上边的指令若无表明,默认是在当前项目根目录下实行的。

始发利用 Zend_Layout,首先让 bootstrap 来加载 Layout
资源。通过下面的命令可实现:

$zf enable layout
# Layouts have been enabled, and a default layout created at
# application/layouts/scripts/layout.phtml
# A layout entry has been added to the application config file.

此时,application/configs/application.ini 内容自动更新了:

; application/configs/application.ini

; Add to [production] section:
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

以此命令告诉应用程序去 application/layouts/scripts 去寻找 layout。

咱们还要启用 XHTML DocType 讲明,为此,在 bootstrap 中加载该资源。在
bootstrap中添加资源的最简单易行的主意就是创制一个以init最先的法门。此时,我们接纳
_initDoctype() 方法来开头化 doctype:

// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDoctype()
    {
    }
}

有了这些格局,还需要让 view 使用科学的 doctype,但是 view
从哪个地方来?最简便的点子就是初叶化 View 资源;有了它,就可以把 view
对象放入 bootstrap 并采纳它。

累加下行到 aplication/configs/application.ini 来创建 view 资源:

; application/configs/application.ini

; Add to [production] section:
resources.view[] =

然后再来充实一下 _initDoctype() 方法。

// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDoctype()
    {
        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML1_STRICT');
    }
}

接下来,创造全局的 layout:

<!-- application/layouts/scripts/layout.phtml -->
<?php echo $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Zend Framework Quickstart Application</title>
  <?php echo $this->headLink()->appendStylesheet('/css/global.css') ?>
</head>
<body>
<div id="header" style="background-color: #EEEEEE; height: 30px;">
    <div id="header-logo" style="float: left">
        <b>ZF Quickstart Application</b>
    </div>
    <div id="header-navigation" style="float: right">
        <a href="<?php echo $this->url(
            array('controller'=>'guestbook'),
            'default',
            true) ?>">Guestbook</a>
    </div>
</div>

<?php echo $this->layout()->content ?>

</body>
</html>

使用headLink()来生成<link>元素。

现今再打开浏览器并查看源代码,应该能看出
XHTML头部,<head> <title> <body>等部分。

Bootstrap 2
Bootstrap 3

创设一个 Model 和 Database Table

现在考虑一下guestbook的组合,它含有部分笔录,每个记录由注释,时间戳,email地址等组成。我们把它存在数据库里,并有一个唯一id。我们期望能保存、获取具有记录。

从而,一个简易的 guestbook 模型 API 就像下边这样:

// application/models/Guestbook.php

class Application_Model_Guestbook
{
    protected $_comment;
    protected $_created;
    protected $_email;
    protected $_id;

    public function __set($name, $value);
    public function __get($name);

    public function setComment($text);
    public function getComment();

    public function setEmail($email);
    public function getEmail();

    public function setCreated($ts);
    public function getCreated();

    public function setId($id);
    public function getId();
}

class Application_Model_GuestbookMapper
{
    public function save(Application_Model_Guestbook $guestbook);
    public function find($id);
    public function fetchAll();
}
}

上面,大家可以先导考虑怎么着设置数据库了。

先是要先河化 Db 资源。使用 zf configure db-adapter 命令:

zf configure db-adapter "adapter=Pdo_MySql&host=localhost&username=root&password=&dbname=guestbook" production

zf configure db-adapter "adapter=Pdo_MySql&host=localhost&username=root&password=&dbname=guestbook-test" testing

zf configure db-adapter "adapter=Pdo_MySql&host=localhost&username=root&password=&dbname=guestbook-dev" development

只要成功执行,那么在 application/configs/application.ini
中就能看到新增的几行安排:

//application/configs/application.ini

resources.db.adapter = "Pdo_MySql"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname ="guestbook" 

注:要把数据库密码设置成你协调的。

下一场成立数据库,打开 phpMyadmin,创制数量库
guestbook,输入下边SQL语句并推行:

CREATE TABLE IF NOT EXISTS `guestbook` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `email` varchar(32) NOT NULL DEFAULT 'noemail@test.com',
    `comment` varchar(200) NOT NULL,
    `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

接下去我们利用 Table Data
Gateway

机制来连接数据源。Zend_Db_Table 提供了这么些效应。

先是创制一个 Zend_Db_Table 类:

$ zf create db-table Guestbook guestbook

查阅项目布局,发现多了一个 application/models/DbTable/
目录,里面有一个 Guestbook.php 文件。其情节如下:

// application/models/DbTable/Guestbook.php

/**
* This is the DbTable class for the guestbook table.
*/
class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
    /** Table name */
    protected $_name    = 'guestbook';
}

注意 Application_Model_DbTable 类前缀,它对应
application/models/DbTable 目录。

接下来创制一个 Data
Mapper
。Data Mapper
映射对象到数据库。本例中,它将映射 model 到数据源。

$ zf create model GuestbookMapper

下一场打开 application/models/GuestbookMapper.php 并输入以下内容:

// application/models/GuestbookMapper.php

class Application_Model_GuestbookMapper
{
    protected $_dbTable;

    public function setDbTable($dbTable)
    {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;
        return $this;
    }

    public function getDbTable()
    {
        if (null === $this->_dbTable) {
            $this->setDbTable('Application_Model_DbTable_Guestbook');
        }
        return $this->_dbTable;
    }

    public function save(Application_Model_Guestbook $guestbook)
    {
        $data = array(
            'email'   => $guestbook->getEmail(),
            'comment' => $guestbook->getComment(),
            'created' => date('Y-m-d H:i:s'),
        );

        if (null === ($id = $guestbook->getId())) {
            unset($data['id']);
            $this->getDbTable()->insert($data);
        } else {
            $this->getDbTable()->update($data, array('id = ?' => $id));
        }
    }

    public function find($id, Application_Model_Guestbook $guestbook)
    {
        $result = $this->getDbTable()->find($id);
        if (0 == count($result)) {
            return;
        }
        $row = $result->current();
        $guestbook->setId($row->id)
                  ->setEmail($row->email)
                  ->setComment($row->comment)
                  ->setCreated($row->created);
    }

    public function fetchAll()
    {
        $resultSet = $this->getDbTable()->fetchAll();
        $entries   = array();
        foreach ($resultSet as $row) {
            $entry = new Application_Model_Guestbook();
            $entry->setId($row->id)
                  ->setEmail($row->email)
                  ->setComment($row->comment)
                  ->setCreated($row->created);
            $entries[] = $entry;
        }
        return $entries;
    }
}

当今,创制 model 类,仍旧使用 zf 命令:

$ zf create model Guestbook

打开刚刚成立的模型类: application/models/Guestbook.php 并添加以下代码:

// application/models/Guestbook.php

class Application_Model_Guestbook
{
    protected $_comment;
    protected $_created;
    protected $_email;
    protected $_id;

    public function __construct(array $options = null)
    {
        if (is_array($options)) {
            $this->setOptions($options);
        }
    }

    public function __set($name, $value)
    {
        $method = 'set' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid guestbook property');
        }
        $this->$method($value);
    }

    public function __get($name)
    {
        $method = 'get' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid guestbook property');
        }
        return $this->$method();
    }

    public function setOptions(array $options)
    {
        $methods = get_class_methods($this);
        foreach ($options as $key => $value) {
            $method = 'set' . ucfirst($key);
            if (in_array($method, $methods)) {
                $this->$method($value);
            }
        }
        return $this;
    }

    public function setComment($text)
    {
        $this->_comment = (string) $text;
        return $this;
    }

    public function getComment()
    {
        return $this->_comment;
    }

    public function setEmail($email)
    {
        $this->_email = (string) $email;
        return $this;
    }

    public function getEmail()
    {
        return $this->_email;
    }

    public function setCreated($ts)
    {
        $this->_created = $ts;
        return $this;
    }

    public function getCreated()
    {
        return $this->_created;
    }

    public function setId($id)
    {
        $this->_id = (int) $id;
        return $this;
    }

    public function getId()
    {
        return $this->_id;
    }
}

终极,大家创制一个 guestbook controller 查询并突显数据库中的结果:

$ zf create controller Guestbook

这将创制 application/controllers/GuestbookController.php,它有一个
IndexAction 方法,同时,在 application/views/scripts/guestbook
目录中开创了一个 index.phtml 文件。

开拓 GuestbookController,在 IndexAction 中添加代码,展现所有的
guestbook 记录:

// application/controllers/GuestbookController.php

class GuestbookController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $guestbook = new Application_Model_GuestbookMapper();
        $this->view->entries = $guestbook->fetchAll();
    }
}

打开 application/views/scripts/guestbook/index.phtml 添加以下内容:

<!-- application/views/scripts/guestbook/index.phtml -->

<p><a href="<?php echo $this->url(
    array(
        'controller' => 'guestbook',
        'action'     => 'sign'
    ),
    'default',
    true) ?>">Sign Our Guestbook</a></p>

Guestbook Entries: <br />
<dl>
    <?php foreach ($this->entries as $entry): ?>
    <dt><?php echo $this->escape($entry->email) ?></dt>
    <dd><?php echo $this->escape($entry->comment) ?></dd>
    <?php endforeach ?>
</dl>

切换来浏览器,打开:http://guestbook.local/guestbook
,你应该看到那几个内容:
Bootstrap 4

发现没有数量,这就打开
phpMyadmin,插入一些数目再看看,复制下边的sql语句到phpmyadmin并执行:

INSERT INTO `guestbook`.`guestbook` (`id`, `email`, `comment`, `created`) VALUES (NULL, 'noemail@qq.com', 'good', CURRENT_TIMESTAMP),
(NULL, 'noemail2@qq.com', 'good book', CURRENT_TIMESTAMP),
(NULL, 'noemail3@qq.com', 'good book ok', CURRENT_TIMESTAMP);

刷新浏览器,结果如图所示,成功地从数据库读取数据并呈现在页面上:
Bootstrap 5

创建 Form

为了让 guestbook 更有效一些,我们需要一个表单来交给新的评介项。

第一,创建一个 form 类:

$ zf create form Guestbook

打开刚创制的 form 类 application/forms/Guestbook.php ,添加下列代码:

// application/forms/Guestbook.php

class Application_Form_Guestbook extends Zend_Form
{
    public function init()
    {
        // Set the method for the display form to POST
        $this->setMethod('post');

        // Add an email element
        $this->addElement('text', 'email', array(
            'label'      => 'Your email address:',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array(
                'EmailAddress',
            )
        ));

        // Add the comment element
        $this->addElement('textarea', 'comment', array(
            'label'      => 'Please Comment:',
            'required'   => true,
            'validators' => array(
                array('validator' => 'StringLength', 'options' => array(0, 20))
                )
        ));

        // Add a captcha
        $this->addElement('captcha', 'captcha', array(
            'label'      => 'Please enter the 5 letters displayed below:',
            'required'   => true,
            'captcha'    => array(
                'captcha' => 'Figlet',
                'wordLen' => 5,
                'timeout' => 300
            )
        ));

        // Add the submit button
        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Sign Guestbook',
        ));

        // And finally add some CSRF protection
        $this->addElement('hash', 'csrf', array(
            'ignore' => true,
        ));
    }
}

下面代码定义了三个因素:email地址,评论输入框,验证码,提交按钮和CSRF爱慕字段。

下一步,添加 signAction
GuestbookController,它用于拍卖表单提交页面。使用 zf 命令创造:

$ zf create action sign Guestbook

创办了 signAction 和相应的 view script.

接下来添加一些代码到
signAction,首先检查是否有POST或GET请求,然后若没有就概括地体现表单,若有,则印证提交的数额,并保留到数据库中

// application/controllers/GuestbookController.php

class GuestbookController extends Zend_Controller_Action
{
    // snipping indexAction()...

    public function signAction()
    {
        $request = $this->getRequest();
        $form    = new Application_Form_Guestbook();

        if ($this->getRequest()->isPost()) {
            if ($form->isValid($request->getPost())) {
                $comment = new Application_Model_Guestbook($form->getValues());
                $mapper  = new Application_Model_GuestbookMapper();
                $mapper->save($comment);
                return $this->_helper->redirector('index');
            }
        }

        $this->view->form = $form;
    }
}

当然,还亟需编制一下 view
application/views/scripts/guestbook/sign.phtml

<!-- application/views/scripts/guestbook/sign.phtml -->

Please use the form below to sign our guestbook!

<?php
$this->form->setAction($this->url());
echo $this->form;

反省职能

今昔再打开浏览器:http://quickstart.local/guestbook/sign
看看,效果如下:
Bootstrap 6

Bootstrap,填写好表单点击提交,就能观察列表已经更新了:
Bootstrap 7

注:
下面的验证码部分辨认很拮据,其实假若复制一下贴补到txt文档中就能看了解了。

恭喜你!

你曾经打响地应用 Zend Framework 的常用功用建立了一个概括的应用程序。Zend
Framework 内置了好多零部件,你可以直接用在你的品种中,这个组件包括 web
services,搜索,PDF读取和创办,身份阐明等等。能够在
文档参考
中找到更多相关的技术细节。

转载请表明来源:http://www.cnblogs.com/feifeifanye/p/6252633.html
英文原文链接:https://framework.zend.com/manual/1.12/en/learning.html

相关文章