用控制器写一个Hello World
根据上一篇博文中的文件结构与Http请求的生命周期,我们知道每一个请求发给入口脚本再到应用主题,应用主体会创建一个控制器来处理这个应用,那么我们就写一个输出Hello World的控制器吧。
namespace app\controllers;
use yii\web\Controller;
class MyController extends Controller {
public function actionIndex() {
echo 'hello world !';
}
}
对于一个控制器我认为有这么几点需要注意:
1. php文件名必须与类名一致。
2. 这个名字首字母必须大写,而且必须以Controller为后缀
3. 要继承yii\web\Controller这个类
4. 我们的控制器的命名空间必须为app\controllers.
5. 控制器类中要有一个公开方法,这个方法的名字必须以action为前缀,并且action后第一个字母要大写。
这样我们在浏览器中输入localhost[port]/[project name]/web/index.php?r=my/index 就可以把http请求发送到YII的入口脚本中。 其中r=my/index多解释一下:r是“路由”的意思,将请求发送给controller ID为“my”的控制器中,action ID为“index”
控制器+视图
修改一下我们的控制器:
public function actionIndex($param) {
return $this->render('index',['param' => $param]);
}
$this->render('index',['param' => $param])
这个render是从Controller类中继承过来的,作用是渲染一个叫做index的视图,并把我们的参数带进去。如果没有参数,那么render函数的第二个参数可以不写。
我们就创建这个名叫index的视图
This is Parameter : <?= $param ?>
为了能让控制器根据render函数找到我们的视图,视图就要保存为/views/[Controller ID]/[View Name].php 也就是/views/my/index.php。
浏览器中输入localhost[:port]/[project name]/web/index.php?r=my/index¶m=hello+world
,就可以得到MyController控制器return回来的视图。
控制器+视图+模型
先创建一个模型MyModel,如下:
namespace app\models;
use yii\base\Model;
class MyModel extends Model {
public $name;
public $email;
public function rules() {
return [
[['name', 'email'] , 'required'],
['email', 'email'],
];
}
}
这个就是我们的模型了,只有姓名和邮箱两个属性。rules函数提供了这个数据模型的填写规范[['name','email'], 'required']
,这一句是name和email都是必须填写的,['email','email']
的意思是email属性必须符合邮箱的填写规范。
下面要改一下我们的控制器:
namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\MyModel;
class MyController extends Controller {
public function actionIndex() {
$model = new MyModel();
if($model->load(Yii::$app->request->post()) && $model->validate()) {
return $this->render('success',['model' => $model]);
} else {
return $this->render('model', ['model' => $model]);
}
}
}
控制器先判断是否提交过合格的表单,如果没有就去渲染需要用户填写的页面的视图等待提交回此控制器,如果有就去渲染展示页面的视图。展示页没什么好说的,这个提交页可以看看:
<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
$form = ActiveForm::begin();
?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<?= Html::submitButton("submit") ?>
<?php
ActiveForm::end();
?>
这个使用Yii提供的函数来生成一部分HTML,这么做会减少很多工作。而且如果这个表单是我们自己用HTML来写的话呢,会遇到一个问题:提交表单之后会遇到HTTP400错误,因为YII框架有一个防止csrf(跨站请求伪造)攻击的体制,所以我们手动写HTML一般来说是没法向其发送请求的。如果我们偏要手动的话,请在表单中加上: <input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
。