控制器
-
控制器、操作与访问规则
1 .控制器以【控制器名+Controller】命名在@app\controllers目录下,继承自yii\web\Controller。
2 .路由格式是【操作ID/操作ID】,控制器ID test-user相当于类名TestUserController。
3 .操作以 action + 方法名构成,操作ID say-hello相当于方法名actionSayHello。在@app\controllers目录下建立Test控制器:
<?php
namespace app\controllers; //定义命名空间
use yii\web\Controller; //引入命名空间
class TestController extends Controller{
public function actionIndex(){
echo 'hello word!';
}
}
在浏览器访问http://localhost/yii2/web/index.php?r=test 输出hello word!
-
控制器的一些方法
1 .重定向 $this->redirect([‘test/index’])
2 .回到首页 $this->goHome()
3 .返回 $this->goBack()
4 .刷新当前页面 $this->refresh()
5 .渲染视图 $this->render(视图,注入视图数组数据)
6 .渲染没有layout的视图 $this->renderPartial(视图,注入视图数组数据)
7 .响应Ajax请求,饿哦有layout的视图 $this->renderAjax(视图,注入视图数组数据)修改Test控制器的index操作
<?php
namespace app\controllers; //定义命名空间
use yii\web\Controller; //引入命名空间
class TestController extends Controller{
public function actionIndex(){
//echo 'hello word!';
//重定向(这儿循环重定向了)
//return $this->redirect(['test/index']);
//回到首页
//return $this->goHome();
//返回
//return $this->goBack();
//刷新(这儿循环重定向了)
//return $this->refresh();
}
}
视图
-
视图规则
1 .视图在views目录下,一个控制器ID对应一个视图目录,TestControler的控制器ID是test,将对应@app/views/test视图目录,视图由yii\web\View组件管理。
在TestController中调用return $this->render('index',['data'=>[1,2,3]]);
在@app\views\test\index.php中获取Test控制器注入的值
<?php
foreach ($data as $key => $value) {
echo $value."<br />";
}
?>
输出:
额,今天这编辑器传不了图片了?
模型
-
模型规则
1 .模型在@app\models目录下模型类名与模型文件名同名,Model一般继承与两个yii2的类,一个是关联到数据库的yii\db\ActiveRecord,这个时候如果类名(文件名)不能与表直接对应,需要通过tableName()公共静态方法显式的指定表名,另一个是继承自yii\base\Model类。
2 .简单操作创建一个测试库yii2basic:
CREATE DATABASE yii2basic;
USEyii2basic;
创建一个文章表
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article`(
`id` int unsigned not null auto_increment,
`title` varchar(100) not null default '' comment '标题',
`desc` varchar(500) not null default '' comment '描述',
`content` text not null comment '内容',
`click` int(8) unsigned not null default 100 comment '点击数',
`status` tinyint(1) not null default 1 comment '状态',
`pubdate` int(10) unsigned not null default 0 comment '录入时间戳',
primary key(`id`)
)ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='文章表' AUTO_INCREMENT=1;
插入测试数据:
NSERT INTO `yii2basic`.`article`(`title`,`desc`,`content`) VALUES('测试标题1','测试描述1','测试内容1');
INSERT INTO `yii2basic`.`article`(`title`,`desc`,`content`) VALUES('测试标题2','测试描述2','测试内容2');
配置数据库信息在@app\config目录下的db.php:
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '123456',
'charset' => 'utf8',
];
在@app\models目录下创建Article.php,类Article继承自ActiveRecord,类名与表明一样,所以不用显式的指定表名
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Article extends ActiveRecord{
}
在@app\controllers目录的Test控制器中我们引入Article的命名空间
use app\models\Article;
在index操作中实例化:
$article = new Article();
echo '<pre>';
var_dump($article);
echo '</pre>';
访问test/index操作,输出:
查一条数据试试
Test控制器的index操作中我们查询一条数据,当然,我们也可以不用use命名空间,但是每次都要指定命名空间全路径,有点麻烦:
<?php
namespace app\controllers; //定义命名空间
use yii\web\Controller; //引入命名空间
class TestController extends Controller{
public function actionIndex(){
$article = new \app\models\Article();
$article = \app\models\Article::findOne(1);
echo '<pre>';
var_dump($article);
echo '</pre>';
}
}
数据查询到了