二、下载最新的 ZFTool 包
这里要强调一下最好下载最新的 ZFTool 包,由于 ZFTool 一直在更新,会不断修改一些发现的 Bug,所以最好使用最新的版本。点击这里下载
点击右下侧带红圈的按钮,下载 ZFTool Zip 包。下载的文件名是:ZFTool-master.zip。解压这个压缩包到 ZFTool 目录。目录结构见下图
我的 ZFTool 目录完整路径是:e:\Web\ZF2Working\ZFTool,你可以自定义 ZFTool 目录的路径
三、手工安装ZFTool并建立项目(失败)
在 ZFTool 根目录中有一个 zf.php 文件,ZFTool 的说明中也提到了这个文件。我就用它来试试建立一个项目。
1 | e:\Web\ZF2working\ZFTool>php zf.php create project e:\Web\ZF2working\pm |
命令报错
1 | Error: I cannot find the autoloader of the application. |
2 | 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。
添加内容:http://framework.zend.com/manual/2.0/en/modules/zendtool.introduction.html 这个是zend framework2关于zftool和zftool.phar的介绍
将下载得到的 zftool.phar 文件放入 e:\Web\ZF2Working\ 目录中,你可以放在任何目录下。
先来看看是否可以正常运行,显示一下 zftool 的版本号吧
1 | e:\Web\ZF2working>php zftool.phar version |
得到以下结果
1 | ZFTool - Zend Framework 2 command line Tool |
2 | The ZFTool is using Zend Framework 2.2.2 |
截图如下:
看来 zftool.phar 可以独立运行的,接下来就建立一个项目框架
语法:
1 | php zftool.phar create project <path> |
实例:
1 | e:\Web\ZF2working>php zftool.phar create project pm |
得到以下结果
1 | ZF2 skeleton application installed in e:\Web\ZF2Working\pm. |
2 | In order to execute the skeleton application you need to install the ZF2 library. |
3 | Execute: "composer.phar install" in e:\Web\ZF2Working\pm |
4 | For more info in e:\Web\ZF2Working\pm/README.md |
截图如下:
这里建立的新项目只是一个空白的 ZF2 应用程序框架,也就是前几讲所提到的 ZendFramework 应用骨架(ZendSkeletonApplication)目录结构如下:
注意1:在以上建立项目的命令中,项目名称包含两层意思:
- 项目的名称;
- 项目的目录名;
在上例中 pm 是我要建立的项目名称,同时也是项目所在的目录名。
注意2:项目所在目录不要事先存在,按照上例所示,如果 pm 目录已经存在,在创建新项目时就会报错。
假设 pm 目录已经存在,执行
1 | e:\Web\ZF2working>php zftool.phar create project pm |
得到以下错误信息:
1 | The directory e:\Web\ZF2Working\pm already exists. You cannot create a ZF2 project here. |
截图如下:
无论这个 pm 目录中是否有内容,只要在创建项目时这个 pm 目录已经存在,就会报错。
所以在建立项目前不要手工创建项目目录或者指定一个已经存在的目录,zftool.phar 工具会为你自动创建项目目录。
由于用 zftool.phar 建立的只是一个空白的应用框架,所以还需要为它安装 ZF2 类库。
五、安装ZF2类库
安装 ZF2 类库有四种方法,其中有三种在前面的教程中已经提到了,这里不再叙述。
- 手工安装 ZF2(见第一讲“手工安装”)
- 使用 ZF2 公共库(见第二讲)
- 使用 zftool.phar 安装 ZF2 类库
- 使用 composer.phar 安装 ZF2 类库(见第一讲“在线安装”).推荐使用这个啊
1.手动安装比较简单:
“手动安装”的就是不用命令行方式下载 ZF2库,而是需要你手动将ZF2库添加到 ZendSkeletonApplication 目录中。
“手动安装”ZF2库具体步骤:
下载ZF2,浏览器打开http://framework.zend.com/downloads/latest 选择 Zend Framework 2.X Minimal
解压 ZendFramework-minimal-2.2.1.zip 文件到项目目录里的 vendor 子目录下的 ZF2 子目录下。
至此 ZF2 的“手动安装”全部结束。
2 使用 ZF2 公共库
说明:
1、我的 DocumentRoot 为 E:\Web
2、自定义虚拟主机 DocumentRoot 为 E:\Web\ZF2Working\zf2-tutorial\public
3、我在 e:\Web\ZF2Working 目录下新建了一个目录(ZF2Library)存放 ZF2 的类库文件,如下图所示
要设定公用 ZF2 类库,有三种方法,但我只成功了两种。
一、修改 php.ini 方法
将 ZF2 类库路径添加到 php.ini 的 include_path 变量中
1、打开 php.ini 文件
2、找到 Paths and Directories 段
3、修改 include_path 值
1 | include_path = ".;PATH\TO\php\pear" |
修改成
1 | include_path = ".;PATH\TO\php\pear;E:\Web\ZF2Working\ZF2Library" |
4、重启 Apache
这个方法我没有成功!有同学成功的话记得告诉我一下,谢谢。
二、修改 httpd.conf 文件
自定义一个环境变量 ZF2_PATH 到 httpd.conf 文件中
1、打开 httpd.conf 文件
2、在文件的最后添加一句
1 | SetEnv ZF2_PATH "E:/Web/ZF2Working/ZF2Library" |
3、保存 httpd.conf 并退出
4、重启Apache
3 再讲一下使用 zftool.phar 安装ZF2类库
语法:
1 | php zftool.phar install zf <path> [<version>] |
4 | <version> 需要安装的ZF2类库版本号,如果不指定将使用最新版 |
实例:
1 | E:\Web\ZF2Working>php zftool.phar install zf e:\Web\ZF2Working\pm\vendor\ZF2Library |
得到结果如下:
1 | The ZF library 2.2.2 has been installed in e:\Web\ZF2Working\pm\vendor\ZF2Library. |
截图如下:
注意:
1、整个安装过程需要等待一段时间,时间长短取决于你的网络
2、我使用了默认的版本(既最新版2.2.2),如果你希望指定版本,可以使用一下命令:
1 | E:\Web\ZF2Working>php zftool.phar install zf e:\Web\ZF2Working\pm\vendor\ZF2Library 2.1 |
在安装路径后输入“ 版本号”
3、与创建项目一样,指定的路径中最后存放 ZF2 类库的目录(在上例中最后一个目录指 ZF2Library
)不能事先存在,否则报错,工具会为你自动创建。
假设我们指定以下命令
1 | E:\Web\ZF2Working>php zftool.phar install zf e:\Web\ZF2Working\pm\vendor\ZF2 |
就会得到以下错误信息:
1 | The directory e:\Web\ZF2Working\pm\vendor\ZF2 already exists. You cannot install the ZF2 library here. |
截图如下:
整个ZF2类库目录结构如下:
六、设定虚拟目录
现在 ZF2 应用框架以及 ZF2 类库都已经安装好了,接着就可以按照第一讲所说的方法设定一下虚拟目录,然后运行。以下为修改内容
1、修改vhost.conf
02 | DocumentRoot "E:/Web/ZF2Working/pm/public" |
03 | ServerName pm.localhost |
05 | SetEnv APPLICATION_ENV development |
06 | SetEnv ZF2_PATH "E:/Web/ZF2Working/pm/vendor/ZF2Library/library/" |
07 | <Directory "E:/Web/ZF2Working/pm/public" > |
08 | DirectoryIndex index.php |
请注意第六行
1 | SetEnv ZF2_PATH "E:/Web/ZF2Working/pm/vendor/ZF2Library/library/" |
这是指定ZF2类库所在路径。我们上面安装路径是
1 | E:/Web/ZF2Working/pm/vendor/ZF2Library/ |
但是 zftool.phar 会自动创建一个子目录叫:library,然后将ZF2类库安装在 library 子目录下(既E:/Web/ZF2Working/pm/vendor/ZF2Library/library/Zend),如果在 SetEnv 中你设定 ZF2_PATH 是:
1 | E:/Web/ZF2Working/pm/vendor/ZF2Library/ |
那么在浏览器中运行 pm.localhost 时会报错,找不到 Loader/AutoloaderFactory.php 文件。
2、修改hosts
浏览器中打开pm.localhost得到以下结果
七、使用 composer.phar 安装 ZF2 类库
使用 zftool.phar 创建新的项目之后,官方推荐使用 composer.phar 来安装 ZF2 类库,我们也试试。
1、进入新建的项目目录
1 | E:\Web\ZF2Working> cd pm |
在 pm 根目录下有 composer.phar 文件
2、更新 composer.phar
1 | E:\Web\ZF2Working\pm>php composer.phar self-update |
3、安装 ZF2 类库
1 | E:\Web\ZF2Working\pm>php composer.phar install |
ZF2 类库就安装好了。
目录结构如下:
用 composer.phar 安装 ZF2 类库比起 zftool.phar 有个好处就是解决依赖性的问题。使用 zftool.phar 安装 ZF2 类库时需要制定类库的安装路径,并且在配置虚拟目录时需要指定类库路径。使用 composer.phar 就不用那么麻烦了,安装 ZF2 类库时不需要制定安装路径,配置虚拟目录时也不用制定类库路径。
以下是使用两个工具安装ZF2类库的区别:
1、安装命令的不同
1 | 使用 zftool.phar,需要指定安装路径 |
2 | php zftool.phar install zf e:\Web\ZF2Working\pm\vendor\ZF2Library |
4 | 使用 composer.phar,不需要指定安装路径 |
5 | php composer.phar install |
2、配置虚拟目录的不同
01 | 使用 zftool.phar 工具安装 ZF2 类库之后的 vhost.conf 文件配置 |
02 | 需要设定 SetEnv ZF2_PATH 参数 |
05 | DocumentRoot "E:/Web/ZF2Working/pm/public" |
06 | ServerName pm.localhost |
08 | SetEnv APPLICATION_ENV development |
09 | SetEnv ZF2_PATH "E:/Web/ZF2Working/pm/vendor/ZF2Library/library/" |
10 | <Directory "E:/Web/ZF2Working/pm/public" > |
11 | DirectoryIndex index.php |
01 | 使用 composer.phar 工具安装 ZF2 类库之后的 vhost.conf 文件配置 |
05 | DocumentRoot "E:/Web/ZF2Working/pm/public" |
06 | ServerName pm.localhost |
08 | SetEnv APPLICATION_ENV development |
09 | <Directory "E:/Web/ZF2Working/pm/public" > |
10 | DirectoryIndex index.php |
八、创建模块(Module)
使用 zftool.phar 可以创建我们所需要的模块(Module)
语法:
1 | php zftool.phar create module <name> [<path>] |
3 | <name> 要创建的模块(Module)名称 |
实例:
我们创建一个 Login 模块
1 | E:\Web\ZF2Working>php zftool.phar create module Login e:\Web\ZF2Working\pm |
得到结果:
1 | The module Login has been created in e:\Web\ZF2Working\pm |
截图如下:
目录结构如下:
看到红色圆角框中已经自动创建了一个模块(Module)的基本结构。
再看看 pm/config/application.config.php 的内容
13 | 'module_listener_options' => array ( |
14 | 'module_paths' => array ( |
18 | '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)失败
语法:
1 | php zftool.phar create controller <name> <module> |
3 | <name> 要创建的控制器(Controller)名称 |
4 | <module> 控制器(Controller)所在的模块(Module)名称 |
实例:在 pm 项目的 Login 模块中建立一个名为 Login 的控制器,输入以下命令:
1 | E:\Web\ZF2Working\pm>php zftool.phar create controller Login Login |
得到创建失败的提示:
01 | 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 |
09 | 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 |
截图如下:
失败的原因在于没有找到和初始化ZFTool模块(Module)!
接下来就说说如何修复这个错误
十、将ZFTool安装成模块(Module)
还记得我们在“二、下载最新的ZFTool包”中所下载并解压的 ZFTool 包木,现在要用到它了。复制整个 ZFTool 目录到你项目所在目录中的 vendor 子目录下,复制完以后目录就够如下:
好了,ZFTool 已经安装成模块(Module)了。
十一、第二次创建控制器(Controller)再次失败
再次用命令在 pm 项目的 Login 模块中建立一个名为 Login 的控制器,输入以下命令:
1 | E:\Web\ZF2Working\pm>php zftool.phar create controller Login Login |
还是失败!!!
1 | PHP Warning: mkdir (): No such file or directory in E:\Web\ZF2Working\pm\vendor\ZFTool\src\ZFTool\Controller\CreateController.php on line 141 |
3 | Warning: mkdir (): No such file or directory in E:\Web\ZF2Working\pm\vendor\ZFTool\src\ZFTool\Controller\CreateController.php on line 141 |
4 | 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 |
6 | 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 |
7 | There was an error during controller creation. |
截图如下:
失败原因:mkdir() 函数无法创建目录。打开 CreateController.php 文件看了看发现是 mkdir() 函数少了个参数,修改以下代码:
CreateController.php第141行
修改为:
1 | mkdir ( $dir , 0777, True); |
由于 $dir 是一个路径,在这个路径中包含了两个不存在的目录,而 mkdir() 函数默认不是递归创建目录的,所以会报错。添加第三个参数(既设置递归创建目录设置为 True)。
修改后保存文件
十二、第三次创建控制器(Controller)成功!
再次用命令在 pm 项目的 Login 模块中建立一个名为 Login 的控制器,输入以下命令:
1 | E:\Web\ZF2Working\pm>php zftool.phar create controller Login Login |
终于得到成功的信息:
1 | 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)
语法:
1 | php zftool.phar modules [list] 显示调用的模块(modules) |
实例:
1 | php zftool.phar modules |
结果:
截图如下:
上图说明在 pm 项目中调用了两个模块,Application 和 Login
2、显示当前 ZF2 版本号
语法:
1 | php zftool.phar version<span></span> | --version 显示当前 Zend Framework 版本号 |
实例
1 | php zftool.phar version |
结果:
1 | ZFTool - Zend Framework 2 command line Tool |
2 | The application in this folder is using Zend Framework 2.2.2 |
截图如下:
3、诊断一个模块(Module)
语法:
1 | php zftool.phar diag [options] [module name] |
3 | [module name] (可选)要测试的模块名称 |
7 | -b -- break 在第一个失败的地方停止测试 |
8 | -q --quiet 除非有错误,不然不显示任何内容 |
9 | --debug 从测试中显示原始的调试(Debug)信息 |
实例:显示 Application 模块的详细信息
1 | php zftool.phar diag - v Application |
结果:
1 | $size = $Host.ui.rawui.windowsize; write $($size.width) $($size.height) |
5 | OK ZF: PHP Version: Current PHP version is 5.4.7 |
7 | OK (1 diagnostic tests) |
截图如下:
4、显示和设置应用程序配置信息
语法:
1 | php zftool.phar config list 展示所有的配置信息 |
2 | php zftool.phar config get <name> 显示单个的配置信息,例如: "config get db.host" |
3 | php zftool.phar config set <name> <value> 设置一个配置值(只能修改一个数值) |
暂时没有实例
5、Classmap 生成器
语法:
1 | php zftool.phar classmap generate <directory> <classmap file > [--append|-a] [--overwrite|-w] |
3 | <directory> The directory to scan for PHP classes (use "." to use current directory) |
4 | <classmap file > File name for generated class map file or - for standard output. If not supplied, defaults to |
5 | autoload_classmap.php inside <directory>. |
6 | --append | -a Append to classmap file if it exists |
7 | --overwrite | -w Whether or not to overwrite existing classmap file |
暂时没有实例
十四、总结
啰嗦了一大堆,不是各位是否看明白了,要使用 ZFTool 工具安装配置确实不太容易,有点搞脑子,不过尝试过一次就熟悉了,为其他同学少走弯路总结一下
1、为创建一个全新的项目(Application),先下载 zftool.phar
2、使用以下命令创建全新项目(Application)
1 | php zftool.phar create project APPLICATION_PATH |
3、复制 zftool.phar 文件到 APPLICATION_PATH 根目录
4、进入 APPLICATION_PATH 目录
5、运行
1 | php composer.phar self-update |
升级 composer.phar 本身
6、运行
1 | 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行,将以下代码
1 | $dir = $path . "/module/$module/view/" . strtolower ( $module ) . "/" . strtolower ( $name ); |
2 | if (! file_exists ( $dir )) { |
修改成
1 | $dir = $path . "/module/$module/view/" . strtolower ( $module ) . "/" . strtolower ( $name ); |
2 | if (! file_exists ( $dir )) { |
3 | mkdir ( $dir , 0777, true); |
既,将 mkdir($dir) 改成 mkdir($dir, 0777, true)
9、在APPLICATION_PATH 根目录下使用 zftool.phar 来创建模块(Module)和控制器(Controller)以及其它命令
有关ZFTool已经全部讲完