[我的PHP之旅] YII框架学习 02.控制器 视图 模型

本文详细介绍了如何使用YII2框架创建控制器、视图和模型,通过编写一个输出HelloWorld的控制器实例,展示了控制器、视图和模型之间的交互,包括控制器的公开方法、路由规则、渲染视图的过程以及如何使用模型处理表单数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用控制器写一个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&param=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 ?>">

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值