1.访问方式
①:http://localhost/tp2/public/index.php/test/h2
②:http://localhost:8003/Test/h2
2.中间件
①定义中间件
namespace app\middleware;
class Check
{
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
echo "中间件执行";
if($request->param("name")=="abc"){
return redirect("test2");
}
//后置中间件,执行完请求方法之后执行中间件代码
//$next($request)返回值就是请求方法执行后返回给浏览器的报文
//echo "-----后置中间件-----------";
//return $response;
//前置中间件,在请求方法执行之前执行相关代码
return $next($request);
}
//请求方法执行完返回到浏览器后,再执行的方法
public function end(Response $response){
echo "<hr/>";
echo $response->getData()."===".$response->getCode();
}
}
②注册中间件
app/middleware.php
\app\middleware\Check::class,
③测试
public function test1($name="aaa"){
return "test1方法".$name;
}
public function test2(){
return "test2方法";
}
路由方式注册中间件:
class Index extends BaseController
{
public function test3($id){
return "id是-->".$id;
}
}
Route::get("t3/:id","index/test3")->middleware(\app\middleware\Auth::class);
//多个中间件
use app\middleware\Auth;
Route::get("t3/:id","index/test3")->middleware([Auth::class,\app\middleware\Check::class]);
别名方式注册中间件:
//config/middleware.php
'alias' => [
"Auth" => \app\middleware\Auth::class,
],
Route::get("t3/:id","index/test3")->middleware(["Auth",\app\middleware\Check::class]);
中间件传递额外参数:
Route::get("t3/:id","index/test3")->middleware(["Auth"],"额外参数");
class Auth
{
public function handle($request, \Closure $next,$thParam)
{
echo $thParam;
return $next($request);
}
}
如果中间件内容较少可以使用闭包方式:
Route::get("t3/:id","index/test3")->middleware(function ($request, \Closure $next){
echo "闭包中间件";
return $next($request);
});
在控制器里注册中间件,当控制器执行的时候执行中间件
class Index extends BaseController
{
protected $middleware=[Auth2::class];
}
//控制器的个别方法执行中间件
class Index extends BaseController
{
protected $middleware=[
Auth2::class=>[
"only"=>['test2'],
"except"=>["test3"]
]
];
....
}
中间件通过$request传递参数到控制器方法
class Auth2
{
public function handle($request, \Closure $next)
{
$request->myName="霸王别姬";
return $next($request);
}
}
public function test2(Request $req){
echo $req->myName;
return "test2方法";
}
3.依赖注入
在方法里传入对象参数,并限制对象类型,对象参数由系统自动创建
class MovelCon extends BaseController
{
public function index(MovieService $movieService){
return $movieService->name;
}
}
依赖注入的类统一由容器管理,也可以手动绑定
public function index(){
bind("ms",MovieService::class);
return app("ms")->name;
}
以上的方法只能在本方法中使用,如果想让类在全局使用,则可在provider.php中添加:
// 容器Provider定义文件
return [
'movie' => app\service\MovieService::class,
];
4.资源路由
①:生成资源控制器
php think make:controller app\controller\Blog --api
②:
Route::resource("blog","Blog");
③:必须用pathinfo模式发送请求
5.Facade门面模式
门面模式为类提供了一种静态调用的方式
源类
class TestFa
{
public function see($name){
return "看电影".$name;
}
}
包装过的类
use think\Facade;
class TestFa extends Facade
{
protected static function getFacadeClass(){
return "app\common\TestFa";
}
}
测试
public function t7(){
return TestFa::see("敦刻尔克");
}
6.服务
服务与依赖注入类似,将类的对象注入到容器中,方便调用;
但是服务的执行优先级较高,在主体程序前就能完成依赖注入,可以做一些初始化,配置参数等功能;
7.事件
TP6.0 文档中关于事件写了很多,有定义事件,有事件监听,还有事件订阅,看起来很复杂,实际上就是事件的不同实现方式;
这里就介绍一个最简单的方式,事件监听
发送事件
class User
{
public function login()
{
Event::trigger('UserLogin');
return '登录方法';
}
}
php think make:listener UserLogin 生成事件监听类
编写事件内容
class UserLogin
{
public $user;
public function __construct(User $user)
{
echo '触发事件类';
$this->user=$user;
}
}
event.php注册事件监听类
<?php
// 事件定义文件
return [
'bind' => [
'UserLogin' => 'app\event\UserLogin',
],
'listen' => [
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
'UserLogin' => ['app\listener\UserLogin'],
],
'subscribe' => [
],
];