04. Yii 2.0 的MVC模式

下面都以 Yii 2.0 基础版(basic)为例,高级版类似。

1. 模型(Models)

模型是 MVC 模式中的一部分, 是代表业务数据、规则和逻辑的对象,可通过继承 yii\base\Model 或它的子类定义模型类。

在模型层创建模型,一般需要继承 yii\base\Model(模型基类)或它的子类。

如,在 basic/models 目录下创建一个模型 UserForm.php,内容如下:

<?php
namespace app\models;
use yii\base\Model;

class UserForm extends Model
{
    public $username;    //属性名和字段名相同
    public $password;
    public $phone;
    public $repassword;

    /**
     * 属性标签
     */
    public function attributeLabels(){
        return [
            'username'    =>    '用户名',
            'password'    =>    '密码',
        ];
    }

    /**
     * 字段验证规则
     */
    public function rules(){
        return [
            [['username', 'password'], 'required', 'message'=>'用户名或密码不能为空!'],    //字段必须
            ['phone', 'required', 'message'=>'手机号不能为空!', 'on'=>'reg'],
            ['username', 'email', 'message'=>'用户名格式不正确!'],    //用户名必须符合邮箱格式
            ['phone', 'match', 'pattern'=>'/^1[3-8][0-9]{9}$/', 'message'=>'手机号格式不正确!', 'on'=>'reg'],
            ['repassword', 'required', 'message'=>'确认密码不能为空!', 'on'=>'reg'],
            ['repassword', 'compare', 'compareAttribute'=>'password', 'message'=>'两次输入的密码不一致!', 'on'=>'reg'],

        ];
    }

    /**
     * 验证规则的场景支持
     */
    public function scenarios(){
        $scenarios = parent::scenarios();
        // 注册场景
        $scenarios['reg'] = ['username', 'password', 'phone', 'repassword'];

        // 登录场景
        $scenarios['login'] = ['username', 'password'];
        return $scenarios;
    }    
}

2. 控制器(Controllers)
Yii 的控制器共有四种,分别是:
yii\web\Controller    主要用于开发web应用,在web应用中,控制器应继承yii\web\Controller 或它的子类
yii\rest\Controller     主要用于开发Restful Web Service,如在开放API模块中,控制器应继承yii\rest\Controller或它的子类
yii\console\Controller    主要用于控制台应用,控制器应继承yii\console\Controller或它的子类
yii\base\Controller    控制器基类
如,在 basic/controllers 目录下新建一个文件 UserController.php,内容如下:
<?php
namespace app\controllers;

use yii\web\Controller;
use app\models\UserForm;
use yii\web\Response;

class UserController extends Controller
{
    /**
     * 用户登录
     */
    public function actionLogin(){
        $model = new UserForm();        // 实例化UserForm模型
        $model->scenario = 'login';        // 指定字段验证场景

        $model->username = 'jack163.com';
//         $model->password = '123456';
        $model->phone = '1527180790';

/*         foreach ($model as $k=>$v){
            echo $k.' '.$v.' '.$model->getAttributeLabel($k).'<br>';
        } */

        if ($model->validate()) {    // 字段验证
            echo 'success';
        } else {
            var_dump($model->getErrors());    //获取所有字段的所有错误
            var_dump($model->getFirstErrors());    //获取所有字段的第一个错误
            var_dump($model->getFirstError('username'));    //获取某个字段的第一个错误
        }
    }

    /**
     * 用户注册
     */
    public function actionRegister(){
        $model = new UserForm();
        $model->scenario = 'reg';        // 指定字段验证场景

        $model->phone = '1527180790';    // 单个属性赋值

//         var_dump($_GET);

        $data = array(
                'username'    =>    ' [email protected]',
                'password'    =>    '123456',
                'repassword'=>    '123456',
                'phone'        =>    '15271807905',
        );
        $model->attributes = $data;        // 块赋值

        if ($model->validate()) {    // 字段验证
            echo 'success';
        } else {
            var_dump($model->getErrors());    //获取所有字段的所有错误
        }

        // 将数据以json格式输出
        \Yii::$app->response->format = Response::FORMAT_JSON;
        return $data;    // 在该方法中,return的内容会直接输出,输出的数据格式由 \Yii::$app->response->format 决定
    }
}

然后,在浏览器输入  http://basic.com/index.php/user/login  和  http://basic.com/index.php/user/register 查看输出结果。

3. 视图(Views)
在 Yii 2.0 中,视图模板文件是php脚本文件,即视图文件的后缀为 .php。
视图总目录为 basic/views,即视图层。
视图总目录下的视图文件夹(视图目录)的名称,应该与控制器的名称一致,且应使用小写字母。
控制器中的方法,默认会渲染当前视图目录中的视图文件。

示例:
在控制器层 basic/controllers 目录下新建一个文件 ViewController.php,内容如下:
<?php
namespace app\controllers;

use yii\web\Controller;

class ViewController extends Controller
{
    public $layout;    // 可在此处指定公共属性 $layout 的值(默认值为main),会对控制器中所有的方法生效。

    public function actionIndex()
    {
        // renderPartial 局部渲染视图文件(不会渲染布局文件的内容)
//         return $this->renderPartial('index');   // 渲染当前视图目录 views/view 中的 index.php文件

        // 跨视图目录渲染
//         return $this->renderPartial('//site/about');  // 渲染 views/site 中的about.php文件

        // renderContent 渲染字符串(同时会渲染布局)
//         return $this->renderContent('<div>This is renderContent</div>');

        // 渲染视图的同时,传递数据
        $data = 'test data';
        $arr = array('id'=>3, 'name'=>'jack');
        return $this->renderPartial('index', array('data'=>$data, 'arr'=>$arr));
    }

    public function actionTestLayout(){
        // 此处设置布局文件为 basic/views/layouts 目录下的 diy.php 文件,只对当前方法生效
        $this->layout = 'diy';    

        // render 渲染视图中的模板文件(同时会渲染布局)
        return $this->render('testLayout');
    }    
}

在视图层  basic/views 目录下,新建一个对应的视图文件夹 view,然后在 basic/views/view 目录下创建一个视图文件 index.php,内容如下:
<div>这是 basic/views/view 视图目录下的 index.php 文件</div>

<?= $data ?>
<hr/>
<?= $arr[id] ?>
<hr/>
<?= $arr['id'] ?>
<hr/>
<?= $arr[name] ?>
<hr/>

<?php 
    foreach ($arr as $v=>$k){
        echo $v.":".$k;
        echo '<br/>';
    }
?>

然后,在浏览器地址栏输入: http://basic.com/view/index ,可看到对应的页面效果。

布局:
布局目录为 basic/views/layouts,它里面的 php 文件,就是布局文件,布局文件中一般都会包含网页的公共头(header)部分和公共尾(footer)部分。默认的布局文件为 main.php。
如,在  basic/views/layouts 下新建一个文件 diy.php,作为自己的布局文件。内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>自定义布局文件</title>
</head>
<body>

<header>
<div><b>这是网页的公共头</b></div>
</header>

<?= $content ?>

<footer>
<div><b>这是网页的公共尾</b></div>
</footer>
</body>
</html>

然后,在  ViewController 所对应的视图目录 basic/views/view 中,创建一个新的视图文件  testLayout.php,内容如下:
<?php
echo __FILE__;
?> 

由于  ViewController 控制器中,已定义了 actionTestLayout 方法,来渲染  testLayout.php 视图文件,故可在浏览器中输入:
http://basic.com/view/test-layout 来访问对应的页面。

注意:如果控制器中的方法为驼峰命名法,在浏览器地址中访问对应的方法时,应全部改为小写,且在中间加上短横线。


你可能感兴趣的:(mvc)