菜菜鸟Zend Framework 2 不完全学习涂鸦(十二)-- ZFTool实例讲解

上一讲翻译的是 ZFTool 的官方教程,不过这个教程那叫个简单啊,简单的看完以后依然不会用,汗!

经过多次尝试,把自己的一些学习和失败过程做一个详细的记录与总结,希望和我一样在学习 ZFTool 的同学能少走一些弯路。

在这里我不再说什么是 ZFTool,以及 ZFTool 能做什么了,要了解这些,请看上一讲

我们直接捞干的。

一、实例场景

我要在 e:\Web\ZF2Working 目录下创建一个全新的项目 pm。有四点需要事先说明:

  1. e:\Web 是我的 DocumentRoot
  2. ZF2Working 目录是我为了区别其它非ZF2项目所建的目录,这个目录里保存所有我的 ZF2 项目
  3. pm 是此次我要建立的全新的项目
  4. 安装过程中最好能够有 git 支持,如果没有安装 git 请点击这里下载并安装,最主要的是将 git.exe 所在路径加入到 PATH 环境变量中。当然没有安装 git 也不要紧,只需忽略 git 的错误信息

二、下载最新的 ZFTool 包

这里要强调一下最好下载最新的 ZFTool 包,由于 ZFTool 一直在更新,会不断修改一些发现的 Bug,所以最好使用最新的版本。点击这里下载

点击右下侧带红圈的按钮,下载 ZFTool Zip 包。下载的文件名是:ZFTool-master.zip。解压这个压缩包到 ZFTool 目录。目录结构见下图

我的 ZFTool 目录完整路径是:e:\Web\ZF2Working\ZFTool,你可以自定义 ZFTool 目录的路径

三、手工安装ZFTool并建立项目(失败)

在 ZFTool 根目录中有一个 zf.php 文件,ZFTool 的说明中也提到了这个文件。我就用它来试试建立一个项目。

e:\Web\ZF2working\ZFTool>php zf.php create project e:\Web\ZF2working\pm
命令报错
Error: I cannot find the autoloader of the application.
Check if E:\Web\ZF2Working\ZFTool contains a valid ZF2 application.
截图如下:

从错误信息了解到,ZFTool 不能独立的运行,需要有一个 ZF2 的应用程序环境。这就形成了一个死循环,我希望用 ZFTool 建立一个全新的项目,而反过来 ZFTool 又需要运行在一个项目环境之中。

怎么办呢?我想到了 ZFTool 官方教程中所提到的一个叫 zftool.phar 的独立文件,用这个试试看。

四、用 zftool.phar 建立项目

从官方教程中得知,zftool.phar 是一个独立的文件,不像 zftool 的 zip 包那样解压后是一堆目录和文件。从这里下载 zftool.phar,同样最好每次使用最新版的 zftool.phar。

将下载得到的 zftool.phar 文件放入 e:\Web\ZF2Working\ 目录中,你可以放在任何目录下。

先来看看是否可以正常运行,显示一下 zftool 的版本号吧

e:\Web\ZF2working>php zftool.phar version
得到以下结果
ZFTool - Zend Framework 2 command line Tool
The ZFTool is using Zend Framework 2.2.2
截图如下:

看来 zftool.phar 可以独立运行的,接下来就建立一个项目框架

语法:

php zftool.phar create project <path>

<path>              创建的项目路径
实例:


e:\Web\ZF2working>php zftool.phar create project pm
得到以下结果
ZF2 skeleton application installed in e:\Web\ZF2Working\pm.
In order to execute the skeleton application you need to install the ZF2 library.
Execute: "composer.phar install" in e:\Web\ZF2Working\pm
For more info in e:\Web\ZF2Working\pm/README.md
截图如下:

这里建立的新项目只是一个空白的 ZF2 应用程序框架,也就是前几讲所提到的 ZendFramework 应用骨架(ZendSkeletonApplication)目录结构如下:

注意1:在以上建立项目的命令中,项目名称包含两层意思:

  1. 项目的名称;
  2. 项目的目录名;

在上例中 pm 是我要建立的项目名称,同时也是项目所在的目录名。

注意2:项目所在目录不要事先存在,按照上例所示,如果 pm 目录已经存在,在创建新项目时就会报错。

假设 pm 目录已经存在,执行

e:\Web\ZF2working>php zftool.phar create project pm
得到以下错误信息:
The directory e:\Web\ZF2Working\pm already exists. You cannot create a ZF2 project here.
截图如下:

无论这个 pm 目录中是否有内容,只要在创建项目时这个 pm 目录已经存在,就会报错。

所以在建立项目前不要手工创建项目目录或者指定一个已经存在的目录,zftool.phar 工具会为你自动创建项目目录。

由于用 zftool.phar 建立的只是一个空白的应用框架,所以还需要为它安装 ZF2 类库。

五、安装ZF2类库

安装 ZF2 类库有四种方法,其中有三种在前面的教程中已经提到了,这里不再叙述。


  1. 手工安装 ZF2(见第一讲“手工安装”
  2. 使用 ZF2 公共库(见第二讲
  3. 使用 zftool.phar 安装 ZF2 类库
  4. 使用 composer.phar 安装 ZF2 类库(见第一讲“在线安装”


这里主要讲一下使用 zftool.phar 安装ZF2类库

语法:

php zftool.phar install zf <path> [<version>]

<path>              ZF2类库安装路径
<version>           需要安装的ZF2类库版本号,如果不指定将使用最新版

实例:

E:\Web\ZF2Working>php zftool.phar install zf e:\Web\ZF2Working\pm\vendor\ZF2Library

得到结果如下:

The ZF library 2.2.2 has been installed in e:\Web\ZF2Working\pm\vendor\ZF2Library.
截图如下:

注意:

1、整个安装过程需要等待一段时间,时间长短取决于你的网络
2、我使用了默认的版本(既最新版2.2.2),如果你希望指定版本,可以使用一下命令:

E:\Web\ZF2Working>php zftool.phar install zf e:\Web\ZF2Working\pm\vendor\ZF2Library 2.1
在安装路径后输入“ 版本号”
3、与创建项目一样,指定的路径中最后存放 ZF2 类库的目录(在上例中最后一个目录指 ZF2Library )不能事先存在,否则报错,工具会为你自动创建。


假设我们指定以下命令

E:\Web\ZF2Working>php zftool.phar install zf e:\Web\ZF2Working\pm\vendor\ZF2

就会得到以下错误信息:

The directory e:\Web\ZF2Working\pm\vendor\ZF2 already exists. You cannot install the ZF2 library here.
截图如下:

整个ZF2类库目录结构如下:

六、设定虚拟目录

现在 ZF2 应用框架以及 ZF2 类库都已经安装好了,接着就可以按照第一讲所说的方法设定一下虚拟目录,然后运行。以下为修改内容

1、修改vhost.conf

<VirtualHost *:80>
   DocumentRoot "E:/Web/ZF2Working/pm/public"
   ServerName pm.localhost
   # This should be omitted in the production environment
   SetEnv APPLICATION_ENV development
   SetEnv ZF2_PATH "E:/Web/ZF2Working/pm/vendor/ZF2Library/library/"
   <Directory "E:/Web/ZF2Working/pm/public">
       DirectoryIndex index.php
       AllowOverride All
       Order allow,deny
       Allow from all
   </Directory>
</VirtualHost>

请注意第六行

SetEnv ZF2_PATH "E:/Web/ZF2Working/pm/vendor/ZF2Library/library/"
这是指定ZF2类库所在路径。我们上面安装路径是
E:/Web/ZF2Working/pm/vendor/ZF2Library/

但是 zftool.phar 会自动创建一个子目录叫:library,然后将ZF2类库安装在 library 子目录下(既E:/Web/ZF2Working/pm/vendor/ZF2Library/library/Zend),如果在 SetEnv 中你设定 ZF2_PATH 是:

E:/Web/ZF2Working/pm/vendor/ZF2Library/

那么在浏览器中运行 pm.localhost 时会报错,找不到 Loader/AutoloaderFactory.php 文件。

2、修改hosts

127.0.0.1 pm.localhost
浏览器中打开pm.localhost得到以下结果

七、使用 composer.phar 安装 ZF2 类库

使用 zftool.phar 创建新的项目之后,官方推荐使用 composer.phar 来安装 ZF2 类库,我们也试试。

1、进入新建的项目目录

E:\Web\ZF2Working>cd pm

在 pm 根目录下有 composer.phar 文件

2、更新 composer.phar

E:\Web\ZF2Working\pm>php composer.phar self-update

3、安装 ZF2 类库

E:\Web\ZF2Working\pm>php composer.phar install


ZF2 类库就安装好了。

目录结构如下:

用 composer.phar 安装 ZF2 类库比起 zftool.phar 有个好处就是解决依赖性的问题。使用 zftool.phar 安装 ZF2 类库时需要制定类库的安装路径,并且在配置虚拟目录时需要指定类库路径。使用 composer.phar 就不用那么麻烦了,安装 ZF2 类库时不需要制定安装路径,配置虚拟目录时也不用制定类库路径。

以下是使用两个工具安装ZF2类库的区别:

1、安装命令的不同

使用 zftool.phar,需要指定安装路径
php zftool.phar install zf e:\Web\ZF2Working\pm\vendor\ZF2Library

使用 composer.phar,不需要指定安装路径
php composer.phar install
2、配置虚拟目录的不同

使用 zftool.phar 工具安装 ZF2 类库之后的 vhost.conf 文件配置
需要设定 SetEnv ZF2_PATH 参数

<VirtualHost *:80>
   DocumentRoot "E:/Web/ZF2Working/pm/public"
   ServerName pm.localhost
   # This should be omitted in the production environment
   SetEnv APPLICATION_ENV development 
   SetEnv ZF2_PATH "E:/Web/ZF2Working/pm/vendor/ZF2Library/library/" 
   <Directory "E:/Web/ZF2Working/pm/public">
       DirectoryIndex index.php
       AllowOverride All
       Order allow,deny
       Allow from all
   </Directory>
</VirtualHost>
使用 composer.phar 工具安装 ZF2 类库之后的 vhost.conf 文件配置
没有 SetEnv ZF2_PATH 参数

<VirtualHost *:80>
   DocumentRoot "E:/Web/ZF2Working/pm/public"
   ServerName pm.localhost
   # This should be omitted in the production environment
   SetEnv APPLICATION_ENV development
   <Directory "E:/Web/ZF2Working/pm/public">
       DirectoryIndex index.php
       AllowOverride All
       Order allow,deny
       Allow from all
   </Directory>
</VirtualHost>

八、创建模块(Module)

使用 zftool.phar 可以创建我们所需要的模块(Module)

语法:

php zftool.phar create module <name> [<path>]

<name>              要创建的模块(Module)名称
<path>              ZF2应用程序根目录(可选)
实例:

我们创建一个 Login 模块

E:\Web\ZF2Working>php zftool.phar create module Login e:\Web\ZF2Working\pm
得到结果:
The module Login has been created in e:\Web\ZF2Working\pm
截图如下:

目录结构如下:

看到红色圆角框中已经自动创建了一个模块(Module)的基本结构。

再看看 pm/config/application.config.php 的内容

<?php
/**
 * Configuration file generated by ZFTool
 * The previous configuration file is stored in application.config.old
 *
 * @see https://github.com/zendframework/ZFTool
 */
return array(
    'modules' => array(
        'Application',
        'Login'
        ),
    'module_listener_options' => array(
        'module_paths' => array(
            './module',
            './vendor'
            ),
        'config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')
        )
    );

看到在 modules 字段中也已经自动为我们添加好了 'Login'。

好了,现在已经可以用 zftool.phar 来建立模块(Module)了,但是在这里还要多啰嗦两句,为创建控制器(Controller)做好准备。

在以上的例子中 zftool.phar 文件与 pm 这个项目是同级的,见下图:

这样做的好处是可以使用一个 zftool.phar 工具通过命令中指定的路径来建立多个项目,也可为多个项目建立多个模块(Module)。但是对接下来为项目创建多个创建控制器(Controller)或者配置应用程序的配置文件(Configuration)来说却不能使用这个单独于任何项目的 zftool.phar 工具。也就是说为了创建控制器(Controller)或者配置文件(Configuration)要将 zftool.phar 文件复制到每个项目的根目录中,在现在这个例子中要将 zftool.phar 文件复制到 pm 目录下。结构见下图:

九、第一次创建控制器(Controller)失败

语法:

php zftool.phar create controller <name> <module>

<name>              要创建的控制器(Controller)名称
<module>            控制器(Controller)所在的模块(Module)名称

实例:在 pm 项目的 Login 模块中建立一个名为 Login 的控制器,输入以下命令:

E:\Web\ZF2Working\pm>php zftool.phar create controller Login Login
得到创建失败的提示:
PHP Fatal error:  Uncaught exception 'Zend\ModuleManager\Exception\RuntimeException' with message 'Module (ZFTool) could not be initialized.' in E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php:175
Stack trace:
#0 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(149): Zend\ModuleManager\ModuleManager->loadModuleByName(Object(Zend\ModuleManager\ModuleEvent))
#1 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(90): Zend\ModuleManager\ModuleManager->loadModule('ZFTool')
#2 [internal function]: Zend\ModuleManager\ModuleManager->onLoadModules(Object(Zend\ModuleManager\ModuleEvent))
#3 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\ModuleManager\ModuleEvent))
#4 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventM in E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php on line 175

Fatal error: Uncaught exception 'Zend\ModuleManager\Exception\RuntimeException' with message 'Module (ZFTool) could not be initialized.' in E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php:175
Stack trace:
#0 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(149): Zend\ModuleManager\ModuleManager->loadModuleByName(Object(Zend\ModuleManager\ModuleEvent))
#1 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(90): Zend\ModuleManager\ModuleManager->loadModule('ZFTool')
#2 [internal function]: Zend\ModuleManager\ModuleManager->onLoadModules(Object(Zend\ModuleManager\ModuleEvent))
#3 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\ModuleManager\ModuleEvent))
#4 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventM in E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php on line 175
截图如下:

失败的原因在于没有找到和初始化ZFTool模块(Module)!

接下来就说说如何修复这个错误

十、将ZFTool安装成模块(Module)

还记得我们在“二、下载最新的ZFTool包”中所下载并解压的 ZFTool 包木,现在要用到它了。复制整个 ZFTool 目录到你项目所在目录中的 vendor 子目录下,复制完以后目录就够如下:

好了,ZFTool 已经安装成模块(Module)了。

十一、第二次创建控制器(Controller)再次失败

再次用命令在 pm 项目的 Login 模块中建立一个名为 Login 的控制器,输入以下命令:

E:\Web\ZF2Working\pm>php zftool.phar create controller Login Login
还是失败!!!
PHP Warning:  mkdir(): No such file or directory in E:\Web\ZF2Working\pm\vendor\ZFTool\src\ZFTool\Controller\CreateController.php on line 141

Warning: mkdir(): No such file or directory in E:\Web\ZF2Working\pm\vendor\ZFTool\src\ZFTool\Controller\CreateController.php on line 141
PHP Warning:  file_put_contents(./module/Login/view/login/login/index.phtml): failed to open stream: No such file or directory in E:\Web\ZF2Working\pm\vendor\ZFTool\src\ZFTool\Controller\CreateController.php on line 146

Warning: file_put_contents(./module/Login/view/login/login/index.phtml): failed to open stream: No such file or directory in E:\Web\ZF2Working\pm\vendor\ZFTool\src\ZFTool\Controller\CreateController.php on line 146
There was an error during controller creation.
截图如下:


失败原因:mkdir() 函数无法创建目录。打开 CreateController.php 文件看了看发现是 mkdir() 函数少了个参数,修改以下代码:

CreateController.php第141行

mkdir($dir);
修改为:
mkdir($dir, 0777, True);

由于 $dir 是一个路径,在这个路径中包含了两个不存在的目录,而 mkdir() 函数默认不是递归创建目录的,所以会报错。添加第三个参数(既设置递归创建目录设置为 True)。

修改后保存文件

十二、第三次创建控制器(Controller)成功!

再次用命令在 pm 项目的 Login 模块中建立一个名为 Login 的控制器,输入以下命令:

E:\Web\ZF2Working\pm>php zftool.phar create controller Login Login

终于得到成功的信息:

The controller Login has been created in module Login.
截图如下:


看看创建的目录结构吧

1、在 Login/src/Login/Controller 目录中创建了 LoginController.php

2、在 Login/view/login/login 目录下创建了 index.phtml 模板

十三、ZFtool的其它命令

在介绍了 ZFTool 最主要的几个命令后,接下来说说其它的几个命令

1、显示调用的模块(Module)

语法:

php zftool.phar modules [list]           显示调用的模块(modules)

实例:

php zftool.phar modules

结果:

Modules installed:
Application
Login
截图如下:

上图说明在 pm 项目中调用了两个模块,Application 和 Login

2、显示当前 ZF2 版本号

语法:

php zftool.phar version | --version      显示当前 Zend Framework 版本号

实例

php zftool.phar version
结果:
ZFTool - Zend Framework 2 command line Tool
The application in this folder is using Zend Framework 2.2.2
截图如下:


3、诊断一个模块(Module)

语法:


php zftool.phar diag [options] [module name]

[module name]       (可选)要测试的模块名称

[options]
-v --verbose        显示详细的信息
-b --break          在第一个失败的地方停止测试
-q --quiet          除非有错误,不然不显示任何内容
--debug             从测试中显示原始的调试(Debug)信息
实例:显示 Application 模块的详细信息



php zftool.phar diag -v Application
结果:



$size = $Host.ui.rawui.windowsize; write $($size.width) $($size.height) 
80
25
Starting diagnostics:
  OK   ZF: PHP Version: Current PHP version is 5.4.7

OK (1 diagnostic tests)
截图如下:


4、显示和设置应用程序配置信息

语法:


php zftool.phar config list                  展示所有的配置信息
php zftool.phar config get <name>            显示单个的配置信息,例如:"config get db.host" 
php zftool.phar config set <name> <value>    设置一个配置值(只能修改一个数值)
暂时没有实例


5、Classmap 生成器

语法:


php zftool.phar classmap generate <directory> <classmap file> [--append|-a] [--overwrite|-w]

<directory>         The directory to scan for PHP classes (use "." to use current directory)
<classmap file>     File name for generated class map file  or - for standard output. If not supplied, defaults to
                    autoload_classmap.php inside <directory>.
--append | -a       Append to classmap file if it exists
--overwrite | -w    Whether or not to overwrite existing classmap file
暂时没有实例


十四、总结

啰嗦了一大堆,不是各位是否看明白了,要使用 ZFTool 工具安装配置确实不太容易,有点搞脑子,不过尝试过一次就熟悉了,为其他同学少走弯路总结一下

1、为创建一个全新的项目(Application),先下载 zftool.phar

2、使用以下命令创建全新项目(Application)


php zftool.phar create project APPLICATION_PATH
3、复制 zftool.phar 文件到 APPLICATION_PATH 根目录


4、进入 APPLICATION_PATH 目录

5、运行


php composer.phar self-update
升级 composer.phar 本身


6、运行


php composer.phar install
安装 ZF2 类库,默认安装路径是:APPLICATION_PATH/vendor/zendframework/zendframework


此命令需要 git 支持,如果没有安装 git 也可以运行

7、下载ZFTool的Zip包,解压到 APPLICATION_PATH/vendor/ZFTool 目录下

8、为使用命令创建控制器(Controller),打开 APPLICATION_PATH/vendor/ZFTool/src/ZFTool/Controller/CreateController.php 文件,找到第141行,将以下代码


$dir = $path . "/module/$module/view/" . strtolower($module) . "/" . strtolower($name);
        if (!file_exists($dir)) {
            mkdir($dir);
        }
修改成



$dir = $path . "/module/$module/view/" . strtolower($module) . "/" . strtolower($name);
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
        }
既,将 mkdir($dir) 改成 mkdir($dir, 0777, true)


9、在APPLICATION_PATH 根目录下使用 zftool.phar 来创建模块(Module)和控制器(Controller)以及其它命令


有关ZFTool已经全部讲完,接下来的内容未完待续,谢谢......


转载于:https://my.oschina.net/ohcoding/blog/155512

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值