前置知识
php yii是一个php框架,要确保熟悉类与对象及命名空间
安装
通过归档文件安装
从 yiiframework.com 下载归档文件
将下载的文件解压缩到 Web 访问的文件夹中
将 basic/web 设置为文档根目录(document root)
运行
应用结构
每个应用都有一个入口脚本web/index.php,这是整个应用中唯一可以访问的php脚本,入口脚本接受一个web请求并创建应用实例去处理它
应用在它的组件辅助下解析请求,并分派请求至mvc元素
视图使用小部件去创建复杂和动态的用户界面
请求生命周期
1.用户向入口脚本web/index.php发起请求
2.入口脚本加载应用配置并创建一个应用实例去处理请求
3.应用通过请求组件解析请求的路由
4.应用创建一个控制器实例去处理请求
5.控制器创建一个动作实例并针对操作执行过滤器
6.如果任何一个过滤器返回失败,则动作取消
7.如果所有过滤器都通过,动作将被执行
8.动作会加载一个数据模型,或许是来自数据库
9.动作会渲染一个视图,把数据模型提供给它
10.渲染结果返回给响应组件
11.响应组件发送渲染结果给用户浏览器
说声hello
如何创建一个动作去响应请求
如何创建一个视图去构造响应内容
以及一个应用如何分派请求给动作
创建动作
操作必须声明在控制器中,为了简单起见,直接在SiteController控制器里声明say操作。这个控制器是由文件controllers/SiteController.php定义的
<?php
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
// ...现存的代码...
// 为了hello,需要创建一个say操作,
// 从请求中接收message参数并显示给最终用户
// 如果请求没有message参数,操作将显示默认参数Hello
// say操作被定义为actionSay方法
// Yii使用action前缀区别普通方法和操作
// action前缀后面的名称被映射为操作的id
public function actionSay($message = 'Hello')
{
return $this->render('say', ['message' => $message]);
}
}
给操作命名时,要先理解yii处理操作id。操作id总是被以小写处理。如果一个操作id由多个单词组成,单词之间将由连字符连接(如create-comment)。操作id映射为方法名时移除了连字符,将第一个单词首字母大写,并加上action前缀。如操作id create-comment相当于方法名actionCreateComment
在操作方法中,render()被用来渲染一个名为say的视图文件。message参数也被传入视图,这样就可以在里面使用。操作方法会返回渲染结果。结果会被应用接收并显示给最终用户的浏览器
当操作中调用了render()方法时,它将会按views/控制器ID/视图名.php路径加载php文件
创建视图
views/site/say.php
message参数被输出之前被html-encoded方法处理过
因为参数中可能隐含的恶意js代码会导致跨站脚本xss攻击
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>
say视图脚本输出的内容将会响应结果返回给应用。应用将依次输出结果给最终用户
试运行
http://hostname/index.php?r=site/say&message=Hello+World
会输出hello world的页面
新页面和其它页面使用同样的头部和尾部是因为render()方法会自动把say视图执行的结果嵌入称为布局的文件中,本例中是views/layouts/main.php
上面url参数r代表路由,指向特定操作的独立id。路由格式是控制器id/操作id。应用接受请求的时候会检查参数,使用控制器id去确定哪个控制器被用来处理请求。然后相应控制器将使用操作id去确定哪个操作方法将被用来做具体工作。上述例子中,路由site/say将被解析至SiteController控制器和基本的say操作
使用表单
创建一个让用户提交数据的表单页
为了实现这个目标,需要创建一个操作和两个视图外,还需要创建一个模型
创建模型
models/EntryForm.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'],
];
}
}
上面声明的验证规则表示
name和email值必填
email的值必须满足email规则验证
$model = new EntryForm();
$model->name = 'qiang';
$model->email = 'bad';
//使用validate方法触发数据验证
if ($model->validate()) {
//成功
} else {
//失败
//如果有数据验证失败,将把hasErrors属性设true,想知道具体发生什么错误就调用getErrors
}
创建动作
con/SiteController
class SiteController extends Controller
{
public function actionEntry()
{
//用户提交表单后,
//操作将会渲染一个名为entry-confirm的视图去确认用户输入的数据,
//如果没填表单就提交,或数据验证不通过,entry视图将会渲染输出
$model = new EntryForm;
if ($model->load(Yii::$app->request->post())&& $model->validate()) {
//验证$model收到的数据
return $this->render('entry-confirm', ['model' => $model]);
} else {
//无论是初始化显示还是数据验证错误
return $this->render('entry', ['model' => $model]);
}
}
}
创建视图
site/entry-confirm.php
entry-confirm视图简单地显示提交的name和email数据
<?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>
entry视图显示一个HTML表单
site/entry.php
使用了小部件ActiveForm生成html表单
先用begin()和end()分别用来渲染表单的开始和关闭标签
在这两个方法之间使用了field()方法创建输入框
最后使用yii\helpers\Html::submitButton()方法生成提交按钮
<?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(); ?>
用浏览器访问看是否工作
效果说明
没输入正确的信息时不需要刷新页面就能给出错误提示
其实数据首先由客户端js脚本验证,然后才会提交给服务器通过php验证
警告:客户端验证是提高用户体验手段,无论是否启用,服务端验证都是必须的
输入框的文字标签是field()方法生成的,内容就是模型中该数据的属性名,例如模型中name属性生成的标签就是Name,当然这些都是可以自定义的
<?= $form->field($model, 'name') -> label('自定义 Name')?>
<?= $form->field($model, 'email') -> label('自定义 email')?>
使用数据库
创建一个从数据表country中读取数据并显示
准备数据库
创建一个名为yii2basic的数据库
然后在数据库中创建一个名为 country 的表并插入简单的数据。可以执行下面的语句:
CREATE TABLE `country` (
`code` CHAR(2) NOT NULL PRIMARY KEY,
`name` CHAR(52) NOT NULL,
`population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `country` VALUES ('AU','Australia',18886000);
INSERT INTO `country` VALUES ('BR','Brazil',170115000);
INSERT INTO `country` VALUES ('CA','Canada',1147000);
INSERT INTO `country` VALUES ('CN','China',1277558000);
INSERT INTO `country` VALUES ('DE','Germany',82164700);
INSERT INTO `country` VALUES ('FR','France',59225700);
INSERT INTO `country` VALUES ('GB','United Kingdom',59623400);
INSERT INTO `country` VALUES ('IN','India',1013662000);
INSERT INTO `country` VALUES ('RU','Russia',146934000);
INSERT INTO `country` VALUES ('US','United States',278357000);
配置数据库连接
config/db.php
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
上面的数据库连接可以在应用中通过Yii::$app->db表达式访问
持续更新中……