声明:本文内容来自于yiichina.com的权威指南。
安装
推荐使用composer来安全,可能有点慢(要下载的依赖比较多)。
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
启动
yii框架的入口文件是web/index.php。但是在访问yii框架之前,如果不是使用composer来安装yii框架的话,那么就需要修改config/web.php中的cookieValidationKey,这个值是用来验证cookie的。
如果是通过composer安装的话,那么就不用再手动添加cookieValidationKey,因为composer已经帮忙添加了。
配置虚拟主机或者直接访问入口文件,都行。
本地访问localhost/basic/web/index.php,即可看到运行结果。
创建控制器(controller)以及动作(action)
需要注意以下几点:
1、控制器是放在controllers/目录下的
2、文件名要和控制器(类名)相同。
3、控制器名称的格式为XyzController。
4、要将控制器声明在appcontrollers这个命名空间下。
5、声明的控制器要继承yii的控制器,使用use yiiwebController即可。该类的位置是vendor/yiisoft/yii2/web/Controller.php,这个类继承yiiaseController。
6、控制器可以有多个动作,动作的命名规范是actionAbc()。
下面是一个简单的HelloController.php
<?php namespace appcontrollers; use yiiwebController; class HelloController extends Controller { public function actionIndex() { echo "hello yii"; } }
访问控制器和动作
格式为:localhost/basic/web/index.php?r=hello/index。
index.php后面的r表示路由;hello对应的是控制器HelloController;index对应的是控制器中的actionIndex动作。
如果action是index,那么访问的时候,不用在写index了,因为index是默认的动作(在缺省action的时候)。也就是说,如果只写了controller,那么默认的访问这个controller中的index动作。
设置默认的控制器和动作
在config/web.php中的$config数组中增加"defaultRoute" => "hello/index"即可。
设置之后,缺省控制器和动作的时候,默认会访问HelloController中的actionIndex方法。
每一个控制器都有一个属性,这个属性是$defaultAction,默认值为index,可以通过修改这个值来修改默认action。
创建模型(model)
和创建控制器一样,有以下规则:
1、控制器是放在models/目录下的
2、文件名要和模型(类名)相同。
3、模型名默认是没有限制的,如果继承了ActiveRecord类的话,那么模型名称应尽量和数据库表名相同。
4、要将模型声明在appmodels这个命名空间下。
5、声明的模型要继承yii的模型基类,使用use yiiaseModel即可。该类的位置是vendor/yiisoft/yii2/base/Model.php。
<?php namespace appmodels; use yiiaseModel; class Demo extends Model { public function showContent() { print_r(array(__CLASS__, __METHOD__)); } }
在控制器中使用模型
首先要在控制器中导入模型,使用use关键字。
这里尝试在HelloController中使用上面的Demo模型。
<?php namespace appcontrollers; use yiiwebController; use appmodelsDemo; // 导入模型 class HelloController extends Controller { public function actionIndex() { // echo "hello yii"; $demo = new Demo(); $demo->showContent(); } }
访问localhost/web/index.php?r=hello/index,可以得到如下输出:
Array ( [0] => appmodelsDemo [1] => appmodelsDemo::showContent )
创建视图
创建视图时,需要注意以下几点:
1、视图都是保存在views目录下。
2、对于控制器XyzController来说,在views目录下,应该有一个xyz目录,这个目录保存的就是XyzController使用的视图文件。
3、在视图中访问控制器传递的参数值时,直接echo数组中的$key即可
比如,我要为HelloController创建视图,那么我就在views目录下,创建了一个hello目录,在这个目录下创建一个index.php文件,这个文件的内容为:
<h1><?php echo $item;?></h1>
控制器中加载视图
<?php namespace appcontrollers; use yiiwebController; use appmodelsDemo; // 导入模型 class HelloController extends Controller { public function actionIndex() { return $this->render("index", array("item" => "this is item")); } }
访问localhost/basic/web/index.php?r=hello/index即可看到结果。
创建并使用自定义的布局文件
上面的运行结果也许你有点意外,因为运行之后居然外层居然有样式,这是因为加载视图的时候使用的是render方法,render方法会在加载视图的同时,也会加载一个布局文件。
每一个控制器都有一个属性,$layout,可以通过修改这个属性,来修改加载哪一个布局文件。
布局文件存放的目录是在views/layouts目录下,默认只有一个main.php,这个文件就是布局文件,可以查看其中的内容,需要注意的是,加载的视图文件在显示的时候,是被当做一个变量值输出,<?= $content ?>,$content就是包含控制器分配的数据以及视图文件。其他的内容都是属于布局。
布局文件是公用的,所有的控制器都可以使用。
现在创建一个自定义的布局文件,simple.php,放在/views/layouts目录下。
<h1>this is header</h1> <?= $content ?> <h1>this is footer</h1>
然后在HelloController加载视图之前修改默认的布局。
<?php namespace appcontrollers; use yiiwebController; class HelloController extends Controller { //这个布局文件,在所有的action中都有效 public $layout = "simple"; //定义默认的action public $defaultAction = "index"; public function actionIndex() { //修改的布局文件只在这个action中有效 $this->layout = "simple"; return $this->render("index", array("item" => "this is content")); } }
访问localhost/basic/web/index.php?r=hello/index,可以看到下面这个结果:
不使用布局文件
可以使用renderPartial方法,和render方法功能类似,主要的区别就是不使用布局,即使自己指定了布局文件,也是不会使用布局的。
接收请求参数
接受请求可以使用request组件,需要注意的是,需要导入yii框架的核心类
<?php namespace appcontrollers; use Yii; //导入框架核心类 use yiiwebController; class HelloController extends Controller { public function actionIndex() { $request = Yii::$app->request; // 判断请求的方法 // if ($request->isAjax) { echo"该请求是一个 AJAX 请求"; } // if ($request->isGet) { echo"请求方法是 GET"; } // if ($request->isPost) { echo"请求方法是 POST"; } // if ($request->isPut) { echo"请求方法是 PUT"; } // $get = $request->get(); //等价于$_GET // $post = $request->post(); //等价于$_POST //获取指定的key值,如果没有值的话,则返回null,不会报错 // $name = $request->post("name"); //等价于$_POST['name'] // $age = $request->get("age"); //等价于$_GET['age'] // 如果没有接受到参数时,使用默认参数 // $gender = $request->get("gender", "male"); // $addr = $request->get("addr", "BeiJing"); // 头部信息,比如token $token = $request->headers->get("token"); echo $token; } }
request组件还有很多属性和方法,具体的可以查看:https://www.yiichina.com/doc/guide/2.0/runtime-requests
如果在发起post请求时,出现400错误,
解决方案:在控制器中关闭CSRF验证:public $enableCsrfValidation = false;
响应请求
和请求request组件对应的响应组件response,同样需要当如Yii核心类。
<?php namespace appcontrollers; use Yii; //导入框架核心类 use yiiwebController; class HelloController extends Controller { public $enableCsrfValidation = false; public function actionIndex() { $response = Yii::$app->response; // 设置状态码 // $response->statusCode = 400; //设置和追加header信息 $response->headers->set("key", "one"); $response->headers->add("key", "two"); // 设置响应主体的格式,yii框架会自动设置header的Content-Type // $response->format = yiiwebResponse::FORMAT_JSON; // return ["code" => 0, "msg" => "success"]; //重定向,默认302,可设置为永久重定向301 // return $this->redirect('https://www.so.com', 302); //在入口文件中自定义的常量:defined('BASEURL') or define('BASEURL', __DIR__ . '../../'); $response->sendFile(BASEURL."/controllers/SiteController.php"); } }
session
session在yii框架中也对应一个组件。
<?php namespace appcontrollers; use Yii; //导入框架核心类 use yiiwebController; class HelloController extends Controller { public $enableCsrfValidation = false; public function actionIndex() { $session = Yii::$app->session; $session->open(); //开启session,等同于session_start(); // $session->set("name", "abcdef"); $name = $session->get("name"); echo $name; $session->close(); //关闭session $session->destroy(); } }
cookie
在yii框架中,有两种cookie:
1、请求中携带的cookie,使用Yii::$app->request->cookies;
2、服务器发给客户端的cookie,使用Yii::$app->response->cookies;
<?php namespace appcontrollers; use Yii; //导入框架核心类 use yiiwebController; use yiiwebCookie; //导入yii框架的cookie类 class HelloController extends Controller { public $enableCsrfValidation = false; // 获取请求中的cookie public function actionGetcookie() { $request_cookies = Yii::$app->request->cookies; $response_cookies = Yii::$app->response->cookies; //获取请求中的cookie // 如果没有值的话,返回null echo $name = $request_cookies->getValue("username"); // 如果没有设置值的话,使用默认值 echo $age = $request_cookies->getValue("age", 30); echo $pwd = $request_cookies->getValue("pwd"); if ($request_cookies->has("gender")) { echo $request_cookies->getValue("gender"); } //修改或添加cookie,返回给客户端 //使用yii框架的方法,实例化yii框架的cookie类作为参数。 $response_cookies->add(new Cookie(array("name"=>"gender", "value" => "femle", "expire" => time() + 60, ))); $response_cookies->add(new Cookie(array("name"=>"age", "value" => 30))); $response_cookies->add(new Cookie(array("name"=>"username", "value" => "abcd"))); $response_cookies->add(new Cookie(array("name"=>"pwd", "value" => "123456"))); $response_cookies->remove("pwd"); } }