Yii2基础教程

Yii2基础教程

编写与2018/7/7 适用Yii 2.0

安装

1. 通过composer安装(国内安装超级慢)
composer create-project --prefer-dist yiisoft/yii2-app-basic basic

这将在一个名为 basic 的目录中安装Yii应用程序模板的最新稳定版本。

2. 通过归档文件安装

将下载的文件解压缩到 Web 访问的文件夹中,修改 config/web.php 文件,给 cookieValidationKey 配置项 添加一个密钥(若你通过 Composer 安装,则此步骤会自动完成):

// !!! 在下面插入一段密钥(若为空) - 以供 cookie validation 的需要
'cookieValidationKey' => '在此处输入你的密钥',

文件目录

Basic 
├─assets/ * 资源包 *
│      
├─commands/ * 控制台应用程序 *
│      
├─config/ * 应用配置及其他配置 *
│      console.php
│      db.php * 数据库配置 * 
│      params.php * 自定义配置项 *
│      test.php
│      test_db.php
│      web.php * 系统配置项 *
│      
├─controllers/ * 控制器文件 *
│      
├─mail/ * 发送邮件的相关文件配置 *
│           
├─models/ * 模型文件存放位置 *
│      
├─runtime/ * 运行时文件,日志和缓存等 *
│          
├─tests/ * 测试文件*
│  
├─vagran
│ 
├─vendor/ * 包含已经安装的 Composer 包,包括 Yii 框架自身 *
│              
├─views/ * 包含视图文件 *
│  └─layouts/ * 网站模板 *
│          
├─web/ Web * 应用根目录,包含 Web 入口文件 *
│  │  favicon.ico
│  │  index-test.php
│  │  index.php *应用入口文件 *
│  │  robots.txt
│  │  
│  ├─assets/ * 包含 Yii 发布的资源文件(javascript 和 css) *
│  │              
│  └─css
│          
├─widgets/ * 公用小部件 *
│
│  .bowerrc
│  .gitignore
│  codeception.yml
│  composer.json * Composer配置文件,描述包信息 *
│  composer.lock
│  docker-compose.yml
│  LICENSE.md
│  README.md
│  requirements.php
│  Vagrantfile
│  yii
└──yii.bat

配置信息

配置项绝大部分在config文件夹中,有一些配置项在assets、web
  1. 数据库配置文件config/db.php:
    <?php
     return [
         'class' => 'yii\db\Connection',
         'dsn' => 'mysql:host=localhost;dbname=wifi', * 地址localhost,数据库名wifi*
         'username' => 'hl', * 用户名 *
         'password' => 'hl123', * 密码 *
         'charset' => 'utf8',
     ];
    
  2. 系统配置文件config/web.php:
    <?php
     ···
     $config = [
         ···
         'language'=>'zh-CN', * 语言 *
         'timeZone'=>'Asia/Shanghai', * 时区 *
         'name' => '移动终端特征采集系统', * web名称(也可定义在`config/params.php`) *
         'defaultRoute' => 'site/index', * 默认路由 *
         'layout' => 'sys-man', * 模板 *
         'components' => [
             * jquery在head就引用 *
             'assetManager' => [
                 'bundles' => [
                     'yii\web\JqueryAsset' => [
                         'jsOptions' => [
                             'position' => \yii\web\View::POS_HEAD,
                         ]
                     ],
                 ],
             ],
             * 设置cookie存储路径,不设置该项会导致同一个浏览器无法同时打开两个yii2项目 *
             'request' => [
                 //'csrfParam'=>'wifi_csrf',
                 'csrfCookie' => [
                     'path' => ''
                 ]
             ],
             * 设置session存储路径 *
             'session'=>[
                 'cookieParams' => [
                     'path' => ''
                 ]
             ],
             ···
         ],
     ];
     * debug模块功能(开发模式才有用) *
     if (YII_ENV_DEV) {
         // configuration adjustments for 'dev' environment
         $config['bootstrap'][] = 'debug';
         $config['modules']['debug'] = [
             'class' => 'yii\debug\Module',
             //去掉下行注释开启功能,如果不是本地访问还需要添加本机IP
             //'allowedIPs' => ['127.0.0.1', '::1'],
         ];
     * gii模块功能(开发模式才有用) *
         $config['bootstrap'][] = 'gii';
         $config['modules']['gii'] = [
             'class' => 'yii\gii\Module',
     		 //去掉下行注释开启功能,如果不是本地访问还需要添加本机IP
              //'allowedIPs' => ['127.0.0.1', '::1'],
         ];
     }
     
     return $config;
    
    调用方法:Yii::$app->name
  3. 自定义配置项config/params.php:
    <?php
     return [
         'adminEmail' => 'admin@example.com',
         'webName'=>'basic'
     ];
    
    调用方法:Yii::$app->params['webName']
  4. 全局资源配置项assets/AppAsset.php:
    <?php
    ···
     class AppAsset extends AssetBundle
     {
         public $basePath = '@webroot';
         public $baseUrl = '@web';
         * 公共css *
         public $css = [
             'css/site.css',
         ];
         * 公共js *
         public $js = [
             'js/site.js',
         ];
         * 公共依赖 *
         public $depends = [
             'yii\web\YiiAsset',
             'yii\bootstrap\BootstrapAsset',
         ];
     }
    
    
  5. 入口文件web/index.php:
    为了便于切换使用环境,Yii 提供了一个定义在入口脚本中的 YII_ENV 常量
    <?php
     ···
     defined('YII_ENV') or define('YII_ENV', 'dev'); * 开发模式 *
     defined('YII_ENV') or define('YII_ENV', 'prod'); * 生产模式 *
     defined('YII_ENV') or define('YII_ENV', 'test'); * 测试模式 *
     ···
    
    开发模式下发生错误会输出很多错误日志,生产模式会简化错误信息并减少日志且gii、debug不可用

页面渲染

Yii2是一个MVC模式框架,下面介绍完整渲染页面过程
  1. M即Model,文件放在models文件夹中。
    <?php
    
    namespace app\models;
        
    use yii\base\Model;
        
    class HellowWorld extends Model
    {
        public function GetMessage(){
            return 'hellow world';
        }
    }
    
  2. V即View,文件放在views文件夹中并且根据控制器建立子目录。
    <?php
     echo $message;
    
  3. C即Controller,文件放在controllers文件夹中。
    <?php
    
     namespace app\controllers;
     
     use yii\web\Controller;
     use app\models\HellowWorld;
     
     class HellowWorldController extends Controller
     {
         * actionIndex中action表示可以通过浏览器或者js的ajax交互获取数据,动作名采用驼峰式名命 *
         public function actionIndex(){
             $message=HellowWorld::GetMessage();
             * 这里的index会渲染views/hellow-world/index.php *
             return $this->render('index',[
                 'message'=>$message,
             ]);
         }
     }
    
    浏览器输入127.0.0.1/basic/web/index.php?r=hellow-world即可看到输出hellow world
    浏览器接收到 ?r=hellow-world/index,会到 HellowWorldController.php中然后执行 actionIndex()函数,最后把结果根据 $this->render() 函数指定的视图文件显示到浏览器
  4. 如果有css、js、图片等资源需要引用,可以放在web相关文件夹下:
    假设要引用web/js/app.jsweb/css/app.css,web不需要写或者写成@web/js/app/js
    <img src="img/app.png" alt="">
    <?php
    $this->registerJsFile('js/app.js');
    $this->registerCssFile('css/app.css');
    ?>
    

Gii自动生成

Gii是Yii框架自带的快速构建页面的脚手架
  1. 要使用Gii首先要配置config/web.php:

    $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
         'allowedIPs' => ['127.0.0.1', '::1'], * 把前面的注释去掉并添加允许使用Gii的 * 
     ];
    
  2. 浏览器打开http://127.0.0.1/basic/web/index.php?r=gii即可看到:
    在这里插入图片描述

  3. 点击Model GeneratorStart按钮即图中红色区域:
    在这里插入图片描述

    完成后会发现models下多了一个文件DeviceInfo.php

  4. 点击CRUD Generator按钮即图中黄色区域:
    在这里插入图片描述

    完成后会发现:
    models/search下多了DeviceInfoSearch.php,
    controllers下多了DeviceInfoController.php,
    views下多了device-info文件夹,
    浏览器输入http://127.0.0.1/basic/web/index.php?r=device-info即可查看。

JS从Controller获取数据

如果使用get请求数据请跳过本节,Yii采用CsrfToken验证POST有效性,给出三种方法

  1. 下面是一个JS的Ajax实列:
    $.ajax({
         url:"?r=device-info/get-data",
         type:'post',
         timeout:60000,
         data:{
             //如果没有两者之一,会返回400 (Bad Request)
             _csrf:yii.getCsrfToken(),
             //_csrf:$('meta[name="csrf-token"]').attr('content'),
         },
         success:function(m){
             console.log(m);
         },
         error:function(e){
             console.log(e.responseText);
         }
     })
    
  2. 如果在表单中:
    <input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
    
    如果使用Yii的ActiveForm表单会自动添加
  3. controller函数中禁用认证:
    ···
    class HellowWorldController extends Controller
     {
         public $enableCsrfValidation = false; * 关闭该控制器的所有方法的Csrf验证 *
     }
    

版权声明:本文为maolidi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。