学习yii2.0——基础入门

声明:本文内容来自于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");
	}
}

 

posted @ 2018-02-01 16:10  寻觅beyond  阅读(950)  评论(0编辑  收藏  举报
返回顶部