Yii2学习笔记系列22——Requests(请求处理之请求)

二 07 六月 2016

请求

对于一个应用程序来说,请求代表yii\web\Request对象,它可以提供诸如请求参数、HTTP请求头、cookies等信息。对于一个给定的request,你可以通过request应用组件(默认情况下是yii\web\Request的实例)来访问相应的请求对象。在本章节中,我们主要讲解如何在你的应用程序中使用该组件。

请求参数

为了得到请求的参数,你可以通过调用request组件的get()post()方法,他们会分别返回$_GET$_POST的值。例如:

$request = Yii::$app->request;

$geet = $request->get();
// 等价于:$get = $_GET;

$id = $request->get('id');
// 等价于:$id = isset($_GET['id']) ? $_GET['id'] : null;

$id = $request->get('id', 1);
// 等价于:$id = isset($_GET['id']) ? $_GET['id'] : 1;

$post = $request->post();
// 等价于:$post = $_POST;

$name = $request->post('name');
// 等价于:$name = isset($_POST['name']) ? $_POST['name'] : null;

$name = $request->post('name', '');
// 等价于:$name = isset($_POST['name']) ? $_POST['name'] : '';

信息:除了可以直接通过$_GET$_POST来获取请求的参数,更多的还是建议你像上面展示的那样儿通过request组件来获取请求参数。这会使得编写测试变得非常容易,因为你可以用假的测试请求数据创建一个模拟请求组件。

当实现RESTful API时,你可能经常需要获取通过PUT、PATCH或者其他请求方法提交的参数。你可以通过调用yii\web\Request::getBodyParam()方法来获取这些参数。例如:

$request = Yii::$app->request;

// 返回所有的参数
$params = $request->bodyParams;

// 返回名为"id"的参数
$param = $request->getBodyParam('id');

信息:不同于通过GET提交的参数,通过POSTPUTPATCH等方法提交的参数,是被发送到request body(即请求体)中的。当你通过上述方法访问这些参数时,request组件会解析这些参数。你可以通过配置yii\web\Request::parsers属性来自定义解析这些参数的方式。

请求方法

你可以通过表达式Yii::$app->request->method获取当前的请求所使用的HTTP方法,同时还会提供一系列的布尔类型属性用于检查当前方法是否适用于某些特定类型。例如:

$request = Yii::$app->request;

if ($request->isAjax) { /*请求是AJAX请求*/ }
if ($request->isGet) { /*请求方法是GET*/ }
if ($request->isPost) { /*请求方法是POST*/ }
if ($request->isPut) { /*请求方法是PUT*/ }

请求URL

request组件提供了许多检查当前请求的URL的方法。

假设请求的URL是http://example.com/admin/index.php/product?id=100,你可以像如下总结的一样获取URL的各个部分:

  • url:返回/admin/index.php/product?id=100,这是不包含host信息部分的URL
  • absoluteUrl:返回http://example.com/admin/index.php/product?id=100,这是整个的URL,包括host信息部分
  • hostInfo:返回http://example.com,这是URL的host信息部分
  • pathInfo:返回/product,这是在入口脚本之后、查询标记(即URL中的?号)之前的部分
  • queryString:返回id=100,这是在查询标记之后的部分
  • baseUrl:返回/admin,这是在host信息之后、入口脚本之前的那部分
  • scriptUrl:返回/admin/index.php,这是不包含路径信息和查询字符串的那部分URL
  • serverName:返回example.com,这是URL中的host名
  • serverPort:返回80,这是Web server使用的端口号

HTTP请求头

你可以从yii\web\Request::headeres属性返回的header collection - 请求头集合中提取HTTP请求头信息。例如:

// $headers是yii\web\HeaderCollection的一个对象
$headers = Yii::$app->request0>headers;

// 返回接受的header值
$accept = $headers->get('Accept');

if ($headers->has('User-Agent')) { /*可以获取到User-Agent头*/ }

request组件也提供了快速访问一些常用的头文件的支持,例如:

  • userAgent:返回User-Agent的值
  • contentType:返回Content-Type,用于指示请求体中数据的MIME类型
  • acceptableContentTypes:返回用户可接受的语言,顺序根据用户的偏好设置顺序而定,第一个元素代表了最喜欢的语言

如果你的应用支持多种语言,并且你想要以终端用户最喜欢的语言展示页面,你可以使用语言协商方法yii\web\Request::getPreferredLanguage(),该方法获取你的应用支持的语言列表,将其与acceptableLanguages做对比,返回最适合的语言。

提示:你也可以使用ContentNegotiator过滤器来动态判断应该在响应中使用哪种内容类型和语言。过滤器实现了上述属性和方法的内容协商。

客户端信息

你可以分别通过usereHostuserIP方法获取客户端机器的host名和IP地址。例如:

$userHost = Yii:$app->request->userHost;
$userIP = Yii:$app->request->userIP;

Category: PHP Develop

comments


Yii2学习笔记系列21——Routing and URL Creation(请求处理之引导路由与URL创建)

一 30 五月 2016

当一个Yii应用程序开始处理一个请求的URL时,它所做的第一步是将该URL转换成路由,然后这个路由被用来实例化相应的控制器动作来处理该请求,这整个的过程被称为引导路由。

引导路由的逆过程被称为URL创建,该过程会根据给定的路由和相关的查询参数创建一个URL,当后面该URL被请求时,引导路由可以将其处理为原始的路由以及查询参数。

负责处理引导路由和URL创建的是Yii应用中的urlManager组件,即URL managerURL manager提供了parseRequest()方法用于解析收到的请求,提供createUrl()方法从给定的路由及相应的查询参数创建一个路由。

通过在应用程序中配置urlManager组件,你可以无需修改任何已有的程序代码就能够让你的应用识别任意的URL格式。例如,你通过使用如下的代码来为post/view动作创建一个URL:

use yii\helpers\Url;

// Url::to() 调用UrlManager::createUrl()来创建一个URL
$url = Url::to(['post/view', 'id' => 100 ...

Category: PHP Develop

comments

Read More

Yii2学习笔记系列20——Handling Requests-Bootstrapping(请求处理之启动引导)

五 27 五月 2016

启动引导

启动引导指的是在应用开始解析和处理请求之前,一个预先准备环境的过程。启动引导会在两个地方进行:入口脚本处和应用主体处。

入口脚本中,不同的类库的自动类加载器会被注册进来(Class Autoloader,简称自动加载器),其中包括通过autoload.php文件注册的Composer自动加载器和通过Yii类文件注册的Yii自动加载器。之后,入口脚本会加载应用程序的配置并且创建应用主体的实例。

在应用主体的构造函数中会做以下的工作:

  1. 调用preInit() - 预初始化方法,从而配置一些优先级比较高的属性,例如basePath

  2. 注册异常处理器

  3. 通过给定的应用程序配置初始化应用程序属性。

  4. 调用init() - 初始化方法,它会进而顺序调用bootstrap() - 启动引导方法来引导组件。

    • 加载扩展清单文件vendor/yiisoft/extensions ...

Category: PHP Develop

comments

Read More

Yii2学习笔记系列19——Handling Requests-Overview(请求处理之概述)

四 26 五月 2016

概述

每次Yii应用程序处理一个请求的时候,它都会经历一个相同的流程:

  1. 用户提交指向入口脚本web/index.php的请求。

  2. 入口脚本加载应用程序配置并且创建一个应用程序的实例来处理请求。

  3. 应用程序通过request(请求)应用组件来解析被请求的路由。

  4. 应用程序创建一个控制器实例来处理请求。

  5. 控制器创建一个动作实例并且为其执行访问过滤。

  6. 如果任何一个过滤器失败,动作取消。

  7. 如果所有的过滤器通过,动作继续执行。

  8. action加载一个数据模型,一般从数据库中取得。

  9. action渲染一个视图,同时会加载数据模型。

  10. 渲染后的结果返回给应用程序的response(响应)组件。

  11. 响应组件将渲染后的结果返回到用户的浏览器。

以下示意图展示了一个应用程序如何处理一个请求:

img

Category: PHP Develop

comments

Read More

Yii2学习笔记系列18——Application Structure-Extensions(应用结构之扩展)

六 21 五月 2016

扩展

扩展专门设计的可以在Yii应用中随时被拿来使用并且可以重新发布的软件包,例如,yiisoft/yii2-debug扩展可以实现在你的应用的每个页面底部添加一个用于调试的工具栏,帮助你简单的抓取页面生成的情况。你可以使用扩展来加速你的软件开发进程,你也可以将你的代码打包成扩展来分享给他人使用。

补充:本文中我们使用的术语“扩展”特指Yii软件包,而术语“软件包”和“库”特指Yii专用,而非通常意义的软件包。

使用扩展

想要使用一个扩展,你需要先安装它。大多数的扩展以Composer软件包的形式发布,这样儿的软件包可以通过以下简单的两步来完成安装:

  1. 修改你的应用程序的composer.json文件,写明你要安装的扩展(Composer软件包)。
  2. 运行composer install命令来安装指定的扩展。

注意,如果没有安装Composer命令的话需要先进行安装。

默认情况下,Composer会安装的是在Packagist(最大的开源Composer代码库)中注册过的软件包。你可以在Packagist中查找所需软件包,也可以创建你自己的代码库并且配置Composer来使用该仓库。如果你是在开发私有扩展并且只想在你的项目内共享的话,这种方式就非常有用了。

Composer安装的扩展保存在 ...

Category: PHP Develop

comments

Read More

Yii2学习笔记系列17——Application Structure-Assets(应用结构之前端资源)

一 16 五月 2016

资源

Yii中的资源指的是与Web页面相关的文件,它可以是CSS、JS、图片或者视频文件等等。前端资源一般存放在Web可以访问的目录下并且由Web服务器直接提供。

一个更好的办法就是通过程序来管理资源。例如,当我们在页面中使用yii\jui\DatePicker小部件时,程序不会让你手动去定位所需要的CSS、JS文件等的位置,而是自动引入。当你将小部件升级到一个新版本时,程序会自动使用更新版本的资源文件。在本教程中,我们将会讲解Yii提供的强大的资源管理功能。

资源包

Yii在资源包中管理资源,一个所谓的资源包,简单的说就是放在一个目录下的资源集合,当我们在一个视图中注册一个资源包时,它会将CSS和JS文件包含到要渲染的Web页面中。

定义资源包

资源包是继承自yii\web\AssetBundle的PHP类。资源包的包名仅仅是对应的完整的PHP类名(不包含前面的反斜杠),并且资源包类应该被自动加载。通常它会指明资源所在的位置、CSS和JS文件包含的内容以及该资源包如何依赖其他的资源包。

下面的代码定义基础项目模板中的主要资源包:

<?php

namespace app\assets;

use yii\web\AssetBundle;

class AppAsset ...

Category: PHP Develop

comments

Read More

Yii2学习笔记系列16——Application Structure-Widgets(应用结构之小部件)

日 15 五月 2016

小部件

小部件是视图中可以重复使用的构建单元,用于以面向对象的方式创建复杂的并且可以配置的用户接口元素。例如,一个日期小部件会生成一个允许用户选择他们想要输入的日期的漂亮组件,而我们要做的只是把如下的代码插入到视图中即可:

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget(['name' => 'date']) ?>

Yii提供了许多优秀的小部件,比如activeFormmenujQuery UI widgetsTwitter Bootstrap widgets。下面我们会讲解关于小部件的基础只是,如果你想了解某个小部件请参考对应的API文档。

使用小部件

小部件主要在视图中使用。我们可以通过调用yii\base\Widget::widget()方法在视图中使用小部件,该方法接收一个配置数组用于初始化小部件并且返回小部件的渲染结果。例如,如下示例代码插入一个配置使用俄语并且输入的值会作为$model模型的from_date属性的日期小部件:

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget([
    'model ...

Category: PHP Develop

comments

Read More

Yii2学习笔记系列15——Application Structure-Filters(应用结构之过滤器)

五 13 五月 2016

过滤器

过滤器是控制器动作执行之前或之后执行的对象,例如,访问控制过滤器在动作执行之前运行以确保只有具备权限的终端用户才能访问,内容压缩过滤器在动作执行之后发送给终端用户之前运行以压缩响应内容。

过滤器可能包含 预过滤(过滤逻辑在动作之前)或 后过滤(过滤逻辑在动作之后),也可能同时包含两者。

使用过滤器

过滤器本质上是一类特殊的行为,所以使用 过滤器 和使用 行为 一样。我们可以通过在控制器类中重写yii\base\Controller::behaviors()方法来声明过滤器,如下所示:

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['index', 'view'],
            'lastModified' => function ($action, $params) {
                $q = new \yii\db\Query();
                return $q->from('user')->max ...

Category: PHP Develop

comments

Read More

Yii2学习笔记系列14——Application Structure-Modules(应用结构之模块)

三 11 五月 2016

模块

模块是独立的软件单元,由模型、视图、控制器和其他支持组件组成,终端用户可以访问在应用主体中已安装的模块的控制器,模块被当成小应用主体来看待,但是和应用主体不同的是,模块不能被单独部署,必须属于某个应用主体。

创建模块

模块被组织成一个称为yii\base\Module::basePath的目录,在该目录中有子目录如controllersmodelsviews,分别对应控制器、模型、视图。如下是一个模型的目录结构:

forum/
    Module.php                   模块类文件
    controllers/                 包含控制器类文件
        DefaultController.php    default 控制器类文件
    models/                      包含模型类文件
    views/                       包含控制器视图文件和布局文件
        layouts/                 包含布局文件
        default/                 包含DefaultController控制器视图文件
            index.php            index视图文件
模块类

每个模块都有一个继承yii\base ...

Category: PHP Develop

comments

Read More

Yii2学习笔记系列13——Application Structure-Views(应用结构之视图)

二 10 五月 2016

视图

视图是MVC设计模式的一部分,它是负责向终端用户展示数据的代码。在一个Web应用程序中,通常需要根据视图模板来创建视图,视图模板是包含HTML代码和展示类的PHP代码的PHP脚本文件。它通过yii\web\View应用组件来管理,该组件主要提供通用方法帮助视图构造和渲染,简单起见,我们称视图模板或者视图模板文件为视图。

创建视图

如上面所述,视图是包含HTML和PHP代码的PHP脚本文件,下面就是一个展示登录表单的视图,如你所见,PHP代码用来生成动态的内容例如页面标题和表单,HTML代码则负责把它组织成一个漂亮的HTML页面。

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $form yii\widgets\ActiveForm */
/* @var $model app\models\LoginForm */

$this->title = 'Login';
?>
<h1><?= Html::encode($this ...

Category: PHP Develop

comments

Read More
Page 1 of 4

Next »