附录2:Yii的安装

由于Yii2.0使用了许多PHP的新特性,因此,Yii需要PHP5.4.0以上版本。

有两种方法可以安装Yii,一种是使用Composer,另一种是直接下载压缩包。

使用Composer安装Yii

官方推荐使用Composer安装Yii。这样更方便后期维护,如果需要添加新的扩展或者升级Yii,只要一句命令就OK了。

用过Yii1.1的读者可能还有印象,安装Yii和构建应用是两个步骤:安装Yii,运行Yii搭建应用框架。 但是,如果使用Composer方法安装Yii,安装和构建应用是一步完成了。

这里并不打算介绍Composer的用法,这方面的内容通过官方文档或者搜索引擎都可以找到。 使用Composer安装Yii,也有两种选择:使用基本模版或者高级模版。 这两者最主要的区别在于高级模版提供了环境切换和前后台分离。 对于团队开发而言,环境切换功能很实用。对于大型应用,前后台分离既是逻辑上的划分,也是安全上的需要。 高级模版功能相对丰富,因此,本书在大多数情况下,都使用高级模版所创建应用进行讲解。 至于基本模版,原理上是相通的。

Yii2.0要求Composer必须安装 composer asset 插件。 这个插件使得Composer可以兼容实现NPM和BOWER包管理器的功能。 NPMBOWER 主要用于前端资源(如JS库等)的管理。

# 安装Composer,如果已经安装过,可不必再安装
# curl -s http://getcomposer.org/installer | php

# 对于已经安装过Composer的,可以对其进行更新
php ../composer.phar self-update

# 为Composer 安装 composer asset 插件
php ../composer.phar global require "fxp/composer-asset-plugin:1.0.0-beta2"

# 使用高级模版安装Yii应用到 digpage.com 目录下
php ../composer.phar create-project --prefer-dist yiisoft/yii2-app-advanced digpage.com

# 使用基础模版安装
# composer create-project --prefer-dist yiisoft/yii2-app-basic digpage.com

如果想使用最新的开发版本的Yii基础模版,可加入 --stability=dev 参数。

从压缩包安装

如果使用压缩包安装方式,请按以下步骤:

  1. 从yiiframework.com下载最新的压缩包。

  2. 将压缩包解压缩到 /path/to/digpage.com 目录。

  3. 修改 config/web.php 文件,输入 cookieValidationKey 配置项密钥。 这个密钥主要用于cookie验证。 如果使用Composer安装,则Composer会自动设置一个密钥:

    // !!! insert a secret key in the following (if it is empty) -
    // this is required by cookie validation
    'cookieValidationKey' => 'enter your secret key here',
    

设置Web服务器

常用的Web服务器有nginx + php-fpm和Apache。而且从趋势上看,前者的比重正不断提高。

本教程不打算介绍nginx和Apache的配置安装,这些内容从官方文档和搜索引擎都可以找到相关内容。 这里大体上介绍如何配置Web服务器,使其能够让Yii跑起来。

由于高级模版应用具有前台和后台。 一般来讲,前台和后台分离可以使用不同的主机名、端口,或者使用不同的路径名。使用不同的主机名的,如:

http://frontend.example.com/
http://backend.example.com/

使用不同的路径名的,如:

http://www.example.com/frontend/
http://www.example.com/backend/

无论使用何种方式,目的都是分离前台和后台。由于是在本地开发,我们使用不同的端口来分离前台和后台。 体现在服务器上,采不同主机名、端口进行的分离方式,意味着不同的虚拟主机,甚至是不同的物理服务器。 而不同的路径名的,则表现为同一台主机,不同目录。 这里,我们使用不同的端口来区别前后台,但在物理上,前端和后端面都部署在同一台服务器上,也就是使用虚拟主机。

使用Nginx的配置如下:

# for frontend
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4

    server_name localhost;
    root        /path/to/digpage.com/frontend/web;
    index       index.php;

    access_log  /path/to/digpage.com/frontend/log/access.log main;
    error_log   /path/to/digpage.com/frontend/log/error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_pass   127.0.0.1:9000;
    }

    location ~ /\.(ht|svn|git) {
        deny all;
    }
}

# for backend
server {
    # ...other settings...
    listen 81;
    server_name localhost;
    root /path/to/digpage.com/backend/web;
    # ...other settings...
}

如果使用Apache,也是分前台和后前的配置,以前台为例:

DocumentRoot "path/to/digpage.com/frontend/web"

<Directory "path/to/digpage.com/frontend/web">
    RewriteEngine on

    # If a directory or a file exists, use the request directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # Otherwise forward the request to index.php
    RewriteRule . index.php

    # ...other settings...
</Directory>

对于后台,也是设置一个虚拟机,路径改为 path/to/digpage.com/backend/web 即可。

Yii中的前后台

Yii从来不认得什么是前台,什么是后台。从本质来讲,前台和后台都是应用。 换句话说,你可以先用基本模板开发出一个应用,具有前台的全部功能,然后部署。 如法炮制另一个独立的,具有后台全部功能的应用。 这在原理上是一样一样的。只是,按照我们的经验,前台和后台从逻辑上讲,组成一应用比较符合我们的认知。 而且,从代码复用的角度来讲,我们更希望前台和后台的代码可以互通互用,尽量不要重复造轮子。 但是,对于Yii来讲,前台就是一个完备的应用,后台又是另一个应用。这点区别请读者朋友们留意。

那么Yii的高级模版是如何实现把两个应用整合成一个我们认识上的应用的呢。 我们观察一下 /path/to/digpage.com/ 目录,看看这个高级模版是如何组织代码的。不难发现其中有二个目录 frontend backend 分别代表了前台、后台。

其实你把 frontend backend 中的任意1个目录删除,是不影响剩下的目录的正常运转的。 也就是说,他们相互间是独立的。只不过在代码组织上,他们都放在了 /path/to/application/ 目录下面。

如果深入下去,你会发现不光 frontend backend 其实 console 也是一个完备的Yii应用, 它通常用于维护,是个命令行应用。

总的说,Yii的前台、后台什么的,是我们命名的概念,他们都是独立而完备的应用。 同时,他们又都具有一定的联系,这些联系突出体现在了 common 目录上。 这个目录从字面的意思看,就是通用,对于组织到一起的 frontend backend console 而言, common 中的内容,他们都可以使用。这是Yii中实现代码复用的技巧所在。

更多关于Yii应用的目录结构的内容,请看 Yii应用的目录结构和入口脚本 部分。

配置应用环境

还差最后一步就完成Yii的安装了。这最后一步,就是设置应用环境。在Yii的高级模版应用中,引入了环境的概念。

环境就是指开发环境、测试环境、产品环境等。 对于Yii而言,所谓的环境,就是一组与运行环境相关的配置文件和入口脚本。

Yii对于环境的使用是这样一个原理:采用一个自动化的脚本,每次需要切换环境时,就运行脚本, 由开发者确定要采用何种环境,然后将对应环境的所有配置文件都覆盖当前的配置文件。 在Yii中,与环境相关的文件其实就只有两个:一个是入口脚本 index.php 另一个就是各类配置文件。

在切换环境时,只需要一行命令就全部搞定:

php /path/to/digpage.com/init

这行命令会提示你选择何种开发环境,并确认是否覆盖当前的配置文件。下面是输出的内容:

Yii Application Initialization Tool v1.0

Which environment do you want the application to be initialized in?

  [0] Development
  [1] Production

  Your choice [0-1, or "q" to quit] 0    // 这里选择了 Development 环境

  Initialize the application under 'Development' environment? [yes|no] yes

  Start initialization ...

   generate yii
   generate common/config/main-local.php
   generate common/config/params-local.php
   generate backend/config/main-local.php
   generate backend/config/params-local.php
   generate backend/web/index.php
   generate backend/web/index-test.php
   generate frontend/config/main-local.php
   generate frontend/config/params-local.php
   generate frontend/web/index.php
   generate frontend/web/index-test.php
   generate console/config/main-local.php
   generate console/config/params-local.php
   generate cookie validation key in backend/config/main-local.php
   generate cookie validation key in frontend/config/main-local.php
      chmod 0777 backend/runtime
      chmod 0777 backend/web/assets
      chmod 0777 frontend/runtime
      chmod 0777 frontend/web/assets
      chmod 0755 yii

  ... initialization completed.

从上面的输出可以看出来, init 脚本其实做了3件事:

  • 复制文件到相应位置,覆盖当前配置。
  • 生成 cookieValidationKey 并写入相应文件。
  • 设置相关文件和目录的权限。

如果想更加便捷,可以直接指定相关的参数:

php /path/to/yii-application/init --env=Production overwrite=All

第二种方式直接在命令行中指明使用的环境,并要求全部覆盖当前配置文件。

检验安装情况

在这一篇,我们已经完成了Yii的安装,可能使用了Composer,也可能使用了压缩包。 接着,我们配置好了Web服务器。 最后,我们运行了 init 命令。 那么,Yii应用的基本框架就已经搭建好了。你可在你的浏览器中试试效果。 使用 http://localhost:80/ 可以打开网站前台,使用 http://localhost:81 可以打开后台。

如果觉得《深入理解Yii2.0》对您有所帮助,也请帮助《深入理解Yii2.0》。 谢谢!