Yii2.0学习


Yii2.0 学习


Composer + PHP + Object Oriented Programming OOP面向对象编程

安装

通过 Composer 安装

下载地址

win 下载

在 Web 可访问的文件夹下运行以下命令来 , 安装Yii应用程序模板:

composer create-project --prefer-dist yiisoft/yii2-app-basic basic

通过归档文件安装

通过归档文件安装 Yii 包括三个步骤:

1 从 yiiframework.com 下载归档文件。
2 将下载的文件解压缩到 Web 访问的文件夹中。
3 修改 config/web.php 文件,给 cookieValidationKey 配置项 添加一个密钥(若你通过 Composer 安装,则此步骤会自动完成):
  
      // !!! 在下面插入一段密钥(若为空) - 以供 cookie validation 的需要
      'cookieValidationKey' => '在此处输入你的密钥',

安装 Assets

Yii依靠 Bower 和/或 NPM 软件包来安装 asset(CSS 和 JavaScript)库。

用Composer来获取这些库,允许 PHP 和 CSS/JavaScript 包版本同时解析。

   这可以通过使用 asset-packagist.org 或 composer asset plugin 来实现。 有关更多详细信息,请参阅 Assets 文档。

通过本地 Bower/NPM 客户端管理您的 assets,使用 CDN 或完全避免 assets 的安装。

 防止通过 Composer 安装 assets,请将以下几行添加到您的 'composer.json' 中:
  
  "replace": {
      "bower-asset/jquery": ">=1.11.0",
      "bower-asset/inputmask": ">=3.2.0",
      "bower-asset/punycode": ">=1.3.0",
      "bower-asset/yii2-pjax": ">=2.0.0"
  },

验证启动

通过内置的web server 或者 配置好的web 服务器

在项目 web 目录下可以通过下面的命令:

php yii serve --port=8888


目录机构

basic/                  应用根目录
    composer.json       Composer 配置文件, 描述包信息
    config/             包含应用配置及其它配置
        console.php     控制台应用配置信息
        web.php         Web 应用配置信息
    commands/           包含控制台命令类
    controllers/        包含控制器类
    models/             包含模型类
    runtime/            包含 Yii 在运行时生成的文件,例如日志和缓存文件
    vendor/             包含已经安装的 Composer 包,包括 Yii 框架自身
    views/              包含视图文件
    web/                Web 应用根目录,包含 Web 入口文件
        assets/         包含 Yii 发布的资源文件(javascript 和 css)
        index.php       应用入口文件
    yii                 Yii 控制台命令执行脚本

应用中的文件可被分为两类:在 basic/web 下 ( 可以直接通过 HTTP 访问(例如浏览器) )和 在其它目录下 ( 不能也不应该被直接访问 )的。

Yii 了模型-视图-控制器 (MVC)设计模式

  models 目录包含了所有模型类, 
  
  views 目录包含了所有视图脚本,
  
  controllers 目录包含了所有控制器类。

请求生命周期

用户向入口脚本 web/index.php 发起请求。
入口脚本加载应用配置并创建一个应用 实例去处理请求。
应用通过请求组件解析请求的 路由。
应用创建一个控制器实例去处理请求。
控制器创建一个动作实例并针对操作执行过滤器。
如果任何一个过滤器返回失败,则动作取消。
如果所有过滤器都通过,动作将被执行。
动作会加载一个数据模型,或许是来自数据库。
动作会渲染一个视图,把数据模型提供给它。
渲染结果返回给响应组件。
响应组件发送渲染结果给用户浏览器。


简单的实现 controller + view + model


// controllers/SiteController.php

    <?php
    
    namespace app\controllers;
    
    use yii\web\Controller;
    
    class SiteController extends Controller
    {
        // ...现存的代码...
        // action  say ==> 对应对应的 view
        public function actionSay($message = 'Hello')
        {
            return $this->render('say', ['message' => $message]);
        }
    }
    ?>
    
// views/site/say.php

  接受从controller action中传过来的参数

    <?php
    use yii\helpers\Html;
    ?>
    <?= Html::encode($message) ?>


访问 http://hostname/index.php?r=site/say&message=Hello+World

入口文件 http://hostname/index.php
?r=site 控制器
/say action
&message=hello action参数


创建模型model

yii\base\Model 被用于普通模型类的父类并与数据表无关 yii\db\ActiveRecord 通常是普通模型类的父类但与数据表有关联(译注:yii\db\ActiveRecord 类其实也是继承自 yii\base\Model,增加了数据库处理)

 
// /models/EntryForm.php

<?php
 
 namespace app\models;
 
 use Yii;
 use yii\base\Model;
 
 class EntryForm extends Model{
     public $name;
     public $email;
 
 
     public function rules(){
         return [
             [['name', 'email'], 'required'],
             ['email', 'email']
         ];
     }
 }
 
 
 ?>
 
 //  /controllers/SIteController.php
 
 <?php
    public function actionEntry()
      {
          $entry_model = new EntryForm;
  
          if($entry_model->load(Yii::$app->request->post()) && $entry_model->validate()){
              // 验证 $model 收到的数据
              // 表达式 Yii::$app 代表应用实例,它是一个全局可访问的单例。
              return $this->render('entry-confirm', ['model'=>$entry_model]);
          }else{
              return $this->render('entry', ['model'=>$entry_model]);
          }
      }
 ?>

 

表达式 Yii::$app 代表 应用实例,它是一个全局可访问的单例。 同时它也是一个服务定位器, 能提供 request,response,db 等等特定功能的组件。

在上面的代码里就是使用 request 组件来访问应用实例收到的 $_POST 数据。

// views/site/entry-confirm.php

    <?php
    use yii\helpers\Html;
    ?>
    <p>You have entered the following information:</p>
    
    <ul>
        <li><label>Name</label>: <?= Html::encode($model->name) ?></li>
        <li><label>Email</label>: <?= Html::encode($model->email) ?></li>
    </ul>
    ?>



// views/site/entry.php


<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'name') ?>

    <?= $form->field($model, 'email') ?>

    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>

<?php ActiveForm::end(); ?>


视图使用了一个功能强大的小部件 ActiveForm 生成 HTML 表单

其中的 begin() 和 end() 分别用来渲染表单的开始和关闭标签。

在这两个方法之间使用了 field() 方法去创建输入框。 第一个输入框用于 “name”,第二个输入框用于 “email”。

之后使用 yii\helpers\Html::submitButton() 方法生成提交按钮

访问 http://localhost:8080/index.php?r=site/entry

客户端验证是提高用户体验的手段。 无论它是否正常启用,服务端验证则都是必须的


使用数据库

安装对应数据库的 PDO驱动

修改配置 config/db.php


<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii2basic',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',

    // Schema cache options (for production environment)
    //'enableSchemaCache' => true,
    //'schemaCacheDuration' => 60,
    //'schemaCache' => 'cache',
];


配置的数据库连接 可以在应用中通过 Yii::$app->db 表达式访问

$db = require __DIR__ . '/db.php';

config/db.php 将被包含在应用配置文件 config/web.php 中, 指定了整个应用如何初始化

创建活动记录

不用在里面写任何代码 Yii 就能根据类名去猜测对应的数据表名

如果类名和数据表名不能直接对应, 可以覆写 tableName() 方法 去显式 指定相关表名

// /models/Country.php
  
 
 <?php
 /**
  * Created by PhpStorm.
  * User: Domob
  * Date: 2019/1/9
  * Time: 14:45
  */
 
 namespace app\models;
 
 use yii\db\ActiveRecord;
 
 class Country extends ActiveRecord
 
 //如果类名和数据表名不能直接对应, 可以覆写 tableName() 方法去显式指定相关表名。
 {
 
 }
 
 
 ?>

 
 

country controller

index 操作调用了活动记录 Country::find() 方法,去生成查询语句并从 country 表中取回所有数据。

为了限定每个请求所返回的国家数量,查询在 yii\data\Pagination 对象的帮助下进行分页。

Pagination 对象的使命主要有两点:

 为 SQL 查询语句设置 offset 和 limit 从句, 确保每个请求只需返回一页数据(本例中每页是 5 行)。
 在视图中显示一个由页码列表组成的分页器, 这点将在后面的段落中解释。

 <?php
 /**
  * Created by PhpStorm.
  * User: Domob
  * Date: 2019/1/9
  * Time: 14:51
  */
 namespace  app\controllers;
 
 use yii\web\Controller;
 use yii\data\Pagination;
 use app\models\Country;
 
 
 class CountryController extends Controller{
     public function actionIndex(){
 
         $query = Country::find();
 
         $pagination = new Pagination([
             'defaultPageSize' => 5,
             'totalCount' => $query->count(),
         ]);
 
         $countries = $query->orderBy('name')
             ->offset($pagination->offset)
             ->limit($pagination->limit)
             ->all();
 
         return $this->render('index', [
             'countries' => $countries,
             'pagination' => $pagination,
         ]);
 
     }
 
 }
 
 
 ?>
 

 


使用gii 生成代码

gii 是 yii中的一个模块

配置应用的 modules 属性开启它。通常来讲在 config/web.php 文件中会有以下配置代码:


$config = [ ... ];

if (YII_ENV_DEV) {
   // 在开发环境下 应用会包含 gii 模块
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

访问 http://localhost:8080/index.php?r=gii

生成活动模型 + 整套的GRUD代码

Buy me a 肥仔水!