目录
简介
概述
安装
模型
控制器
视图
小部件
实例
可访问方法
表单
简介
概述
Yii 2.0 需要 PHP 5.4.0+,支持Composer,相比较Yii 1.1属于完全重写的版本。
Yii 2.0中的路径别名必须用@开头,用于区分普通文件目录路径或URL。@Yii指向Yii安装目录。
Yii 2.0视图里的特殊变量$this不再指向当前控制器和小部件,而是指向视图对象。如果要在视图中访问控制器或者小部件,需要用$this->context。
Yii 2.0支持Smarty和Twig两种模板引擎。
Gii是yii里的一个模块,可用于生成一些Web站点常用功能的代码。
部署Yii2应用到线上时,应该把网站目录设置为应用的Web文件夹。
Yii2的应用主体是服务定位器,它提供了一些具有不同功能的应用组件来处理请求,例如db组件处理数据库相关服务。应用组件就像是全局变量,不应该注册过多,可以在/config/web.php的components配置项中查看Yii2里注册的一些应用组件。
安装
通过Composer安装最新的Yii2稳定版运行指令:
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
本次安装的版本号是2.0.43。
安装完成后切换到应用目录【basic】下,启动PHP内置服务器可使用如下指令:
php yii serve
默认开启的端口号是8080。也可以在如上命令后面用--port参数指定端口号。
然后在浏览器地址栏访问http://localhost:8080/看到如下页面表示安装成功。
访问http://localhost:8080/index.php?r=gii即可看到如下图所示的gii模块。
模型
yii\base\Model是模型类的基类且与数据表无关。yii\db\ActiveRecord类间接继承了yii\base\Model类并且添加了数据库处理,因此与数据表有关联。
如果模型数据验证【$model->Validate()】失败,可以通过$model->getErrors()获取错误详细信息。
Yii::$app代表了全局可访问的应用实例,能提供request、response、db等等特定功能组件。
控制器
使用render方法会自动加载视图布局文件/views/layouts/main.php。
控制器ID show-text 对应的控制器类名是ShowTextController,对应的视图文件夹名称是show-text。
控制器里方法名SayHello对应的访问名是say-hello,注意不是用下划线连接,而是用连字符-连接。
客户端提交的信息通过验证后,可以考虑用refresh()或者redirect()方法避免表单重复提交问题。
yii\Web\Response:redirect()方法默认返回的状态码是302,该状态码表示要访问的资源被临时转移到另一个URL上,可以设置状态码为301,表示要访问的资源已经被永久转移到另一个URL上。
视图
yii\helpers\Html encode方法是用来转换特殊字符的,避免XSS攻击。
小部件
yii\Widgets\ActiveForm类能够根据一个或多个数据模型里的设置来生成视图。
Yii提供了很多小部件用于生成复杂且动态的视图,可以把很多视图代码改写为小部件,以提高重用量,加快开发效率。
实例
可访问方法
控制器 /controllers/SiteController.php
public function actionSay($message = 'Hello World!')
{return $this->render('say', ['message' => $message]);
}
视图 /views/site/say.php
<?php
use yii\helpers\Html;
?><?= Html::encode($message) ?>
然后就可以通过http://localhost:8080/index.php?r=site/say【&message=】来访问了。
表单
模型类 /models/EntryForm.php
<?php
namespace app\models;use yii\base\Model;class EntryForm extends Model
{public $username;public $email;public function rules(){return [[['username', 'email'], 'required'],['email', 'email'],];}
}
控制器 /controllers/SiteController.php
public function actionEntry()
{$model = new EntryForm();if ($model->load(Yii::$app->request->post()) && $model->validate()) {return $this->render('entry-form', ['model' => $model]);} else {return $this->render('entry', ['model' => $model]);}
}
视图 /views/site/entry.php
<?php
use yii\helpers\Html;
use yii\Widgets\ActiveForm;?><?php $form = ActiveForm::begin();?><?=$form->field($model, 'username');?>
<?=$form->field($model, 'email');?><div class="form-group"><?=Html::submitButton('Submit', ['class' => 'btn btn-primary']);?>
</div><?php ActiveForm::end();?>
视图 /views/site/entry-form.php
<?phpuse yii\helpers\Html;?><p>You have submitted the following information:
</p><ul><li><label></label><?=Html::encode($model->username);?></li><li><label></label><?=Html::encode($model->email);?></li>
</ul>
然后就可以通过http://localhost:8080/index.php?r=site/entry来测试表单了。