zoukankan      html  css  js  c++  java
  • 学习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、要将控制器声明在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");
    	}
    }
    
  • 相关阅读:
    java封装
    本人的其他博客
    codeforces 1000C
    1005E1 Median on Segments (Permutations Edition) 【思维+无序数组求中位数】
    1009E Intercity Travelling 【数学期望】
    codeforces 1009D Relatively Prime Graph【欧拉函数】
    1077E Thematic Contests 【二分答案】
    codeforces 1077D Cutting Out 【二分】
    【非原创】ZOJ
    数字千万别用puts!
  • 原文地址:https://www.cnblogs.com/-beyond/p/8399586.html
Copyright © 2011-2022 走看看