赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
概述
路由的作用是简化URL访问地址,并根据定义的路由类型做出正确的解析。ThinkPHP5.0的路由支持三种方式的URL解析规则
#普通模式
#混合模式
#强制模式
##2.1注册路由规则
路由注册可以采用方法动态单个和批量注册,也可以直接定义路由定义文件的方式进行集中注册。
#动态注册
路由定义采用\think\Route类的rule方法注册,通常是在应用的路由配置文件application/route.php进行注册,格式是:
Route::rule(‘路由表达式’,‘路由地址’,‘请求类型’,‘路由参数(数组)’,‘变量规则(数组)’);
请求类型包括:
类型 | 描述 |
---|---|
GET | 请求 |
POST | 请求 |
PUT | 请求 |
DELETE | DELETE请求 |
* | 任何请求类型 |
##路由表达式
路由表达式统一使字符串定义,采用规则定义的方式。
#规则表达式
#可选定义
#完全匹配
#批量注册
1.如果不希望一个个注册,可以使用批量注册
2.如果在外面和规则里面同时传入了匹配参数和变量规则的话,路由规则定义里面的最终生效,但请求类型参数以最外层决定
#定义路由配置文件
ThinkPHP5.0支持在规则路由中为变量用正则的方式指定变量规则,弥补了动态变量无法限制具体的类型问题,并且支持全局规则设置。使用方式如下:
#全局变量规则
设置全局变量规则,全部路由有效:
// 设置name变量规则(采用正则定义)
Route::pattern('name','\w+');
// 支持批量添加
Route::pattern([
'name' => '\w+',
'id' => '\d+',
]);
#局部变量规则
局部变量规则,仅在当前路由有效
// 定义GET请求路由规则 并设置name变量规则
Route::get('new/:name','News/read',[],['name'=>'\w+']);
如果一个变量同时定义了全局规则和局部规则,局部规则会覆盖全局变量的定义。
#完整URL规则
如果要对整个URL进行规则检查,可以进行__url__ 变量规则,例如:
// 定义GET请求路由规则 并设置完整URL变量规则
Route::get('new/:id','News/read',[],['__url__'=>'new\/\w+$']);
路由参数是指可以设置一些路由匹配的条件参数,主要用于验证当前的路由规则是否有效
#请求类型
如果指定请求类型注册路由的话,无需设置method请求类型参数。如果使用了rule或者any方法注册路由,或者使用路由配置定义文件的话,可以单独使用method参数进行请求类型检测。
#域名检测
支持使用完整域名或者子域名进行检测
#HTTPS检测
支持检测当前是否HTTPS访问
#前置行为检测
支持使用行为对路由进行检测是否匹配,如果行为方法返回false表示当前路由规则无效。
#后置行为执行
可以为某个路由或者某个分组路由定义后置行为执行,表示当路由匹配成功后,执行的行为
其中\app\index\behavior\ReadInit 行为类定义如下:
namespace app\index\behavior;
use app\index\model\User;
class ReadInfo {
public function run(){
$id = request()->route('id');
request()->user = User::get($id);
}
}
如果成功匹配到new/:id路由后,就会执行行为类的run方法,参数是路由地址,可以动态改变。
#路由绑定模型
可以在当前路由匹配后绑定模型,后面则同过方法的对象自动注入来获取。
Route::get('new/:name$','News/read',['bind_model'=>['User','name']]);
ThinkPHP支持完整域名、子域名和IP部署的路由和绑定功能,同时还可以起到简化URL的作用。
#动态注册
可以在应用的公共文件或者配置文件中动态注册域名部署规则,例如:
// blog子域名绑定到blog模块
Route::domain('blog','blog');
// 完整域名绑定到admin模块
Route::domain('admin.thinkphp.cn','admin');
// IP绑定到admin模块
Route::domain('114.23.4.5','admin');
#泛域名部署
#配置定义方式
#域名绑定地址
// blog子域名绑定到blog模块
Route::domain('blog','blog');
其实是把域名绑定到模块的方式,其实还有其他的绑定方式。
使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如:
Route::get('hello',function(){
return 'hello,world!';
});
参数传递
闭包定义的时候支持参数传递,例如:
Route::get('hello/:name',function($name){
return 'Hello,'.$name;
});
规则路由中定义的动态变量的名称 就是闭包函数中的参数名称,不分次序。
因此,如果我们访问的URL地址是:http://serverName/hello/thinkphp
则浏览器输出的结果是:Hello,thinkphp
一个典型的控制器类定义如下:
namespace app\index\controller;
class Index
{
public function index()
{
return 'index';
}
}
控制器类文件的实际位置是 application\index\controller\Index.php
如果你的控制器类继承了\think\Controller类的话,可以定义控制器初始化方法_initialize,在该控制器的方法调用之前首先执行。
例如:
namespace app\index\controller; use think\Controller; class Index extends Controller { public function _initialize() { echo 'init<br/>'; } public function hello() { return 'hello'; } public function data() { return 'data'; } }
如果访问http://localhost/index.php/index/Index/hello
会输出init hello
如果访问http://localhost/index.php/index/Index/data
会输出init data
示例如下:
namespace app\index\controller; use think\Controller; class Index extends Controller { protected $beforeActionList = [ 'first', 'second' => ['except'=>'hello'], 'three' => ['only'=>'hello,data'], ]; protected function first() { echo 'first<br/>'; } protected function second() { echo 'second<br/>'; } protected function three() { echo 'three<br/>'; } public function hello() { return 'hello'; } public function data() { return 'data'; } }
访问http://localhost/index.php/index/Index/hello
最后的输出结果是first three hello
访问http://localhost/index.php/index/Index/data
最后的输出结果是:first second three data
#页面跳转
在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\think\Controller类内置了两个跳转方法success和error,用于页面跳转提示。
使用方法很简单,举例如下:
namespace app\index\controller; use think\Controller; use app\index\model\User; class Index extends Controller { public function index() { $User = new User; //实例化User对象 $result = $User->save($data); if($result){ //设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER'] $this->success('新增成功', 'User/list'); } else { //错误页面的默认跳转页面是返回前一页,通常不需要设置 $this->error('新增失败'); } } }
跳转地址是可选的,success方法的默认跳转地址是$_SERVER[“HTTP_REFERER”]
#重定向
\think\Controller类的redirect方法可以实现页面的重定向功能。
redirect方法的参数用法和Url::build方法的用法一致(参考URL生成部分),例如:
//重定向到News模块的Category操作
$this->redirect('News/category', ['cate_id' => 2]);
上面的用法是跳转到News模块的category操作,重定向后会改变当前的URL地址。
或者直接重定向到一个指定的外部URL地址,例如:
//重定向到指定的URL地址 并且使用302
$this->redirect('http://thinkphp.cn/blog/2',302);
空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,可以实现错误页面和一些URL的优化。
空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器(Error),利用这个机制我们可以用来定制错误页面和进行URL的优化。
现在我们把前面的需求进一步,把URL由原来的http://serverName/index/city/shanghai/
变成http://serverName/index/shanghai/
这样更加简单的方式,如果按照传统的模式,我们必须给每一个定义一个控制器类,然后在每个控制器类的index方法里面进行处理。 可是如果使用空控制器功能
namespace app\index\controller\one; use think\Controller; class Blog extends Controller { public function index() { return $this->fetch(); } public function add() { return $this->fetch(); } public function edit($id) { return $this->fetch(); } }
该控制器类的文件位置为:application/index/controller/one/Blog.php
访问地址可以使用http://serverName/index.php/index/one.blog/index
如果要在路由定义中使用多级控制器,可以使用:\think\Route::get('blog/add','index/one.Blog/add');
如果要获取当前的请求信息,可以使用\think\Request类,
除了$request = Request::instance();
也可以使用助手函数$request = request();
#获取URL信息
#设置/获取 模块/控制器/操作名称
#获取请求参数
#获取路由和调度信息
#设置请求信息
概述
可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括
G
E
T
、
_GET、
GET、_POST、
R
E
Q
U
E
S
T
、
_REQUEST、
REQUEST、_SERVER、
S
E
S
S
I
O
N
、
_SESSION、
SESSION、_COOKIE、$_ENV等系统变量,以及文件上传信息。
#检测变量是否设置
可以使用has方法来检测一个变量参数是否设置,如下:
Request::instance()->has('id','get');
Request::instance()->has('name','post');
或者使用助手函数
input('?get.id');
input('?post.name');
变量检测可以支持所有支持的系统变量。
#变量获取
#变量过滤
#获取部分变量
#排除部分变量
#变量修饰符
input函数支持对变量使用修饰符功能,可以更好的过滤变量。
用法如下:input('变量类型.变量名/修饰符');
或者Request::instance()->变量类型('变量名/修饰符');
例如:
input('get.id/d');
input('post.name/s');
input('post.ids/a');
Request::instance()->get('id/d');
ThinkPHP5.0版本默认的变量修饰符是/s,如果需要传入字符串之外的变量可以使用下面的修饰符,包括:
修饰符 | 作用 |
---|---|
s | 强制转换为字符串类型 |
d | 强制转换为整型类型 |
b | 强制转换为布尔类型 |
a | 强制转换为数组类型 |
f | 强制转换为浮点类型 |
如果需要更改请求变量的值,可以通过下面的方式:
// 更改GET变量
Request::instance()->get(['id'=>10]);
// 更改POST变量
Request::instance()->post(['name'=>'thinkphp']);
尽量避免直接修改$_GET 或者 $_POST数据,同时也不能直接修改param变量,例如下面的操作是无效的:
// 更改请求变量
Request::instance()->param(['id'=>10]);
在很多情况下面,我们需要判断当前操作的请求类型是GET、POST、PUT、DELETE或者HEAD,一方面可以针对请求类型作出不同的逻辑处理,另外一方面有些情况下面需要验证安全性,过滤不安全的请求。
ThinkPHP5.0 取消了用于判断请求类型的系统常量(如IS_GET,IS_POST等),统一采用 think\Request类 处理请求类型。
用法如下
// 是否为 GET 请求 if (Request::instance()->isGet()) echo "当前为 GET 请求"; // 是否为 POST 请求 if (Request::instance()->isPost()) echo "当前为 POST 请求"; // 是否为 PUT 请求 if (Request::instance()->isPut()) echo "当前为 PUT 请求"; // 是否为 DELETE 请求 if (Request::instance()->isDelete()) echo "当前为 DELETE 请求"; // 是否为 Ajax 请求 if (Request::instance()->isAjax()) echo "当前为 Ajax 请求"; // 是否为 Pjax 请求 if (Request::instance()->isPjax()) echo "当前为 Pjax 请求"; // 是否为手机访问 if (Request::instance()->isMobile()) echo "当前为手机访问"; // 是否为 HEAD 请求 if (Request::instance()->isHead()) echo "当前为 HEAD 请求"; // 是否为 Patch 请求 if (Request::instance()->isPatch()) echo "当前为 PATCH 请求"; // 是否为 OPTIONS 请求 if (Request::instance()->isOptions()) echo "当前为 OPTIONS 请求"; // 是否为 cli if (Request::instance()->isCli()) echo "当前为 cli"; // 是否为 cgi if (Request::instance()->isCgi()) echo "当前为 cgi";
助手函数
// 是否为 GET 请求
if (request()->isGet()) echo "当前为 GET 请求";
……
#请求类型伪装
支持请求类型伪装,可以在POST表单里面提交_method变量,传入需要伪装的请求类型,例如:
<form method="post" action="">
<input type="text" name="name" value="Hello">
<input type="hidden" name="_method" value="PUT" >
<input type="submit" value="提交">
</form>
提交后的请求类型会被系统识别为PUT请求。
#AJAX/PJAX伪装
可以对请求进行AJAX请求伪装,如下:http://localhost/index?_ajax=1
或者PJAX请求伪装http://localhost/index?_pjax=1
可以使用Request对象的header方法获取当前请求的HTTP 请求头信息,例如:
$info = Request::instance()->header();
echo $info['accept'];
echo $info['accept-encoding'];
echo $info['user-agent'];
也可以直接获取某个请求头信息,例如:
$agent = Request::instance()->header('user-agent');
http://serverName/index/blog/3.html
http://serverName/index/blog/3.shtml
http://serverName/index/blog/3.xml
http://serverName/index/blog/3.pdf
hinkPHP的依赖注入(也称之为控制反转)是一种较为轻量的实现,无需任何的配置,并且主要针对访问控制器进行依赖注入。可以在控制器的构造函数或者操作方法(指访问请求的方法)中类型声明任何(对象类型)依赖,这些依赖会被自动解析并注入到控制器实例或方法中。
自动注入请求对象
架构方法注入
在控制器的架构方法中会自动注入当前请求对象,例如:
namespace app\index\controller; use think\Request; class Index { protected $request; public function __construct(Request $request) { $this->request = $request; } public function hello() { return 'Hello,' . $this->request->param('name') . '!'; } }
操作方法注入
控制器的操作方法中如果需要调用请求对象Request的话,可以在方法中定义Request类型的参数,并且参数顺序无关,例如:
namespace app\index\controller;
use think\Request;
class Index
{
public function hello(Request $request)
{
return 'Hello,' . $request->param('name') . '!';
}
}
访问URL地址的时候 无需传入request参数,系统会自动注入当前的Request对象实例到该参数。
如果继承了系统的Controller类的话,也可以直接调用request属性,例如:
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function hello()
{
return 'Hello,'.$this->request->param('name');
}
}
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。