上一讲翻译的是 ZFTool 的官方教程,不过这个教程那叫个简单啊,简单的看完以后依然不会用,汗!
经过多次尝试,把自己的一些学习和失败过程做一个详细的记录与总结,希望和我一样在学习 ZFTool 的同学能少走一些弯路。
在这里我不再说什么是 ZFTool,以及 ZFTool 能做什么了,要了解这些,请看上一讲。
我们直接捞干的。
我要在 e:\Web\ZF2Working 目录下创建一个全新的项目 pm。有四点需要事先说明:
这里要强调一下最好下载最新的 ZFTool 包,由于 ZFTool 一直在更新,会不断修改一些发现的 Bug,所以最好使用最新的版本。点击这里下载
点击右下侧带红圈的按钮,下载 ZFTool Zip 包。下载的文件名是:ZFTool-master.zip。解压这个压缩包到 ZFTool 目录。目录结构见下图
我的 ZFTool 目录完整路径是:e:\Web\ZF2Working\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 的 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:在以上建立项目的命令中,项目名称包含两层意思:
在上例中 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 类库有四种方法,其中有三种在前面的教程中已经提到了,这里不再叙述。
这里主要讲一下使用 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在安装路径后输入“ 版本号”
假设我们指定以下命令
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 类库都已经安装好了,接着就可以按照第一讲所说的方法设定一下虚拟目录,然后运行。以下为修改内容
<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 文件。
127.0.0.1 pm.localhost浏览器中打开pm.localhost得到以下结果
使用 zftool.phar 创建新的项目之后,官方推荐使用 composer.phar 来安装 ZF2 类库,我们也试试。
E:\Web\ZF2Working>cd pm
在 pm 根目录下有 composer.phar 文件
E:\Web\ZF2Working\pm>php composer.phar self-update
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 install2、配置虚拟目录的不同
使用 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>
使用 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 目录下。结构见下图:
语法:
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包”中所下载并解压的 ZFTool 包木,现在要用到它了。复制整个 ZFTool 目录到你项目所在目录中的 vendor 子目录下,复制完以后目录就够如下:
好了,ZFTool 已经安装成模块(Module)了。
再次用命令在 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)。
修改后保存文件
再次用命令在 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 最主要的几个命令后,接下来说说其它的几个命令
语法:
php zftool.phar modules [list] 显示调用的模块(modules)
实例:
php zftool.phar modules
结果:
Modules installed: Application Login截图如下:
上图说明在 pm 项目中调用了两个模块,Application 和 Login
语法:
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截图如下:
语法:
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)截图如下:
语法:
php zftool.phar config list 展示所有的配置信息 php zftool.phar config get <name> 显示单个的配置信息,例如:"config get db.host" php zftool.phar config set <name> <value> 设置一个配置值(只能修改一个数值)暂时没有实例
语法:
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_PATH3、复制 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已经全部讲完,接下来的内容未完待续,谢谢......