下面都以 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(
'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,内容如下:
由于
ViewController 控制器中,已定义了 actionTestLayout 方法,来渲染 testLayout.php 视图文件,故可在浏览器中输入:
http://basic.com/view/test-layout 来访问对应的页面。
注意:如果控制器中的方法为驼峰命名法,在浏览器地址中访问对应的方法时,应全部改为小写,且在中间加上短横线。