使用ZFTool创建全新的zend framework 2项目

来源:互联网 发布:ios蜂窝移动数据开关 编辑:程序博客网 时间:2024/06/06 01:55

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

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

二、下载最新的 ZFTool 包

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

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

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

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

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

1e:\Web\ZF2working\ZFTool>php zf.php create project e:\Web\ZF2working\pm
命令报错
1Error: I cannot find the autoloader of the application.
2Check 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 的版本号吧

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

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

语法:

1php zftool.phar create project <path>
2 
3<path>              创建的项目路径
实例:


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

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

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

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

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

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

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

1e:\Web\ZF2working>php zftool.phar create project pm
得到以下错误信息:
1The 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 类库(见第一讲“在线安装”).推荐使用这个啊

   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 的“手动安装”全部结束。

使用 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 值

1include_path = ".;PATH\TO\php\pear"

修改成

1include_path = ".;PATH\TO\php\pear;E:\Web\ZF2Working\ZF2Library"

4、重启 Apache

这个方法我没有成功!有同学成功的话记得告诉我一下,谢谢。


二、修改 httpd.conf 文件

自定义一个环境变量 ZF2_PATH 到 httpd.conf 文件中

1、打开 httpd.conf 文件

2、在文件的最后添加一句

1SetEnv ZF2_PATH "E:/Web/ZF2Working/ZF2Library"

3、保存 httpd.conf 并退出

4、重启Apache


3   再讲一下使用 zftool.phar 安装ZF2类库

语法:

1php zftool.phar install zf <path> [<version>]
2 
3<path>              ZF2类库安装路径
4<version>           需要安装的ZF2类库版本号,如果不指定将使用最新版

实例:

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

得到结果如下:

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

注意:

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

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


假设我们指定以下命令

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

就会得到以下错误信息:

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

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

六、设定虚拟目录

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

1、修改vhost.conf

01<VirtualHost *:80>
02   DocumentRoot "E:/Web/ZF2Working/pm/public"
03   ServerName pm.localhost
04   # This should be omitted in the production environment
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
09       AllowOverride All
10       Order allow,deny
11       Allow from all
12   </Directory>
13</VirtualHost>

请注意第六行

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

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

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

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

2、修改hosts

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

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

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

1、进入新建的项目目录

1E:\Web\ZF2Working>cd pm

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

2、更新 composer.phar

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

3、安装 ZF2 类库

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


ZF2 类库就安装好了。

目录结构如下:

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

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

1、安装命令的不同

1使用 zftool.phar,需要指定安装路径
2php zftool.phar install zf e:\Web\ZF2Working\pm\vendor\ZF2Library
3 
4使用 composer.phar,不需要指定安装路径
5php composer.phar install
2、配置虚拟目录的不同

01使用 zftool.phar 工具安装 ZF2 类库之后的 vhost.conf 文件配置
02需要设定 SetEnv ZF2_PATH 参数
03 
04<VirtualHost *:80>
05   DocumentRoot "E:/Web/ZF2Working/pm/public"
06   ServerName pm.localhost
07   # This should be omitted in the production environment
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
12       AllowOverride All
13       Order allow,deny
14       Allow from all
15   </Directory>
16</VirtualHost>
01使用 composer.phar 工具安装 ZF2 类库之后的 vhost.conf 文件配置
02没有 SetEnv ZF2_PATH 参数
03 
04<VirtualHost *:80>
05   DocumentRoot "E:/Web/ZF2Working/pm/public"
06   ServerName pm.localhost
07   # This should be omitted in the production environment
08   SetEnv APPLICATION_ENV development
09   <Directory "E:/Web/ZF2Working/pm/public">
10       DirectoryIndex index.php
11       AllowOverride All
12       Order allow,deny
13       Allow from all
14   </Directory>
15</VirtualHost>

八、创建模块(Module)

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

语法:

1php zftool.phar create module <name> [<path>]
2 
3<name>              要创建的模块(Module)名称
4<path>              ZF2应用程序根目录(可选)
实例:

我们创建一个 Login 模块

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

目录结构如下:

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

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

01<?php
02/**
03 * Configuration file generated by ZFTool
04 * The previous configuration file is stored in application.config.old
05 *
06 * @see https://github.com/zendframework/ZFTool
07 */
08return array(
09    'modules' => array(
10        'Application',
11        'Login'
12        ),
13    'module_listener_options' => array(
14        'module_paths' => array(
15            './module',
16            './vendor'
17            ),
18        'config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')
19        )
20    );

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

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

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

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

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

语法:

1php zftool.phar create controller <name> <module>
2 
3<name>              要创建的控制器(Controller)名称
4<module>            控制器(Controller)所在的模块(Module)名称

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

1E:\Web\ZF2Working\pm>php zftool.phar create controller Login Login
得到创建失败的提示:
01PHP 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
02Stack trace:
03#0 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(149): Zend\ModuleManager\ModuleManager->loadModuleByName(Object(Zend\ModuleManager\ModuleEvent))
04#1 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(90): Zend\ModuleManager\ModuleManager->loadModule('ZFTool')
05#2 [internal function]: Zend\ModuleManager\ModuleManager->onLoadModules(Object(Zend\ModuleManager\ModuleEvent))
06#3 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\ModuleManager\ModuleEvent))
07#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
08 
09Fatal 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
10Stack trace:
11#0 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(149): Zend\ModuleManager\ModuleManager->loadModuleByName(Object(Zend\ModuleManager\ModuleEvent))
12#1 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(90): Zend\ModuleManager\ModuleManager->loadModule('ZFTool')
13#2 [internal function]: Zend\ModuleManager\ModuleManager->onLoadModules(Object(Zend\ModuleManager\ModuleEvent))
14#3 E:\Web\ZF2Working\pm\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\ModuleManager\ModuleEvent))
15#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 的控制器,输入以下命令:

1E:\Web\ZF2Working\pm>php zftool.phar create controller Login Login
还是失败!!!
1PHP Warning:  mkdir(): No such file or directory in E:\Web\ZF2Working\pm\vendor\ZFTool\src\ZFTool\Controller\CreateController.php on line 141
2 
3Warning: mkdir(): No such file or directory in E:\Web\ZF2Working\pm\vendor\ZFTool\src\ZFTool\Controller\CreateController.php on line 141
4PHP Warning:  file_put_contents(./module/Login/view/login/login/index.phtml): failed to openstream: No such file or directory in E:\Web\ZF2Working\pm\vendor\ZFTool\src\ZFTool\Controller\CreateController.php on line 146
5 
6Warning: 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
7There was an error during controller creation.
截图如下: 


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

CreateController.php第141行

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

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

修改后保存文件

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

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

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

终于得到成功的信息:

1The 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)

语法:

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

实例:

1php zftool.phar modules

结果:

1Modules installed:
2Application
3Login
截图如下:

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

2、显示当前 ZF2 版本号

语法:

1php zftool.phar version<span></span> | --version      显示当前 Zend Framework 版本号

实例

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


3、诊断一个模块(Module)

语法:


1php zftool.phar diag [options] [module name]
2 
3[module name]       (可选)要测试的模块名称
4 
5[options]
6-v --verbose        显示详细的信息
7-b --break          在第一个失败的地方停止测试
8-q --quiet          除非有错误,不然不显示任何内容
9--debug             从测试中显示原始的调试(Debug)信息
实例:显示 Application 模块的详细信息



1php zftool.phar diag -v Application
结果:



1$size = $Host.ui.rawui.windowsize; write $($size.width) $($size.height)
280
325
4Starting diagnostics:
5  OK   ZF: PHP Version: Current PHP version is 5.4.7
6 
7OK (1 diagnostic tests)
截图如下:


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

语法:


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


5、Classmap 生成器

语法:


1php zftool.phar classmap generate <directory> <classmap file> [--append|-a] [--overwrite|-w]
2 
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)


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


4、进入 APPLICATION_PATH 目录

5、运行


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


6、运行


1php 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)) {
3            mkdir($dir);
4        }
修改成



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


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


有关ZFTool已经全部讲完



0 0
原创粉丝点击