
声明:本文内容来自于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、要将控制器声明在app\controllers这个命名空间下。
5、声明的控制器要继承yii的控制器,使用use yii\web\Controller即可。该类的位置是vendor/yiisoft/yii2/web/Controller.php,这个类继承yii\base\Controller。
6、控制器可以有多个动作,动作的命名规范是actionAbc()。
下面是一个简单的HelloController.php
<?php
namespace app\controllers; use yii\web\Controller; 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、要将模型声明在app\models这个命名空间下。
5、声明的模型要继承yii的模型基类,使用use yii\base\Model即可。该类的位置是vendor/yiisoft/yii2/base/Model.php。
<?php
namespace app\models; use yii\base\Model; class Demo extends Model {
public function showContent() {
print_r(array(__CLASS__, __METHOD__));
}
}
在控制器中使用模型
首先要在控制器中导入模型,使用use关键字。
这里尝试在HelloController中使用上面的Demo模型。
<?php
namespace app\controllers; use yii\web\Controller;
use app\models\Demo; // 导入模型 class HelloController extends Controller {
public function actionIndex()
{
// echo "hello yii";
$demo = new Demo();
$demo->showContent();
}
}
访问localhost/web/index.php?r=hello/index,可以得到如下输出:
Array ( [0] => app\models\Demo [1] => app\models\Demo::showContent )
创建视图
创建视图时,需要注意以下几点:
1、视图都是保存在views目录下。
2、对于控制器XyzController来说,在views目录下,应该有一个xyz目录,这个目录保存的就是XyzController使用的视图文件。
3、在视图中访问控制器传递的参数值时,直接echo数组中的$key即可
比如,我要为HelloController创建视图,那么我就在views目录下,创建了一个hello目录,在这个目录下创建一个index.php文件,这个文件的内容为:
<h1><?php echo $item;?></h1>
控制器中加载视图
<?php
namespace app\controllers; use yii\web\Controller;
use app\models\Demo; // 导入模型 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 app\controllers; use yii\web\Controller; 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 app\controllers; use Yii; //导入框架核心类
use yii\web\Controller; 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 app\controllers; use Yii; //导入框架核心类
use yii\web\Controller; 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 = \yii\web\Response::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 app\controllers; use Yii; //导入框架核心类
use yii\web\Controller; 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 app\controllers; use Yii; //导入框架核心类
use yii\web\Controller;
use yii\web\Cookie; //导入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");
}
}