Laravel学习教程之路由模块(2)

初始化的`Laravel`项目没有对`RouteMatched`路由匹配事件进行任何的监听器绑定,如有需要,可以自定义监听器,在模块的`EventServiceProvider`中注册该事件监听;这样一旦请求匹配上某个路由,就可以执行自定义方法了;

4、通过 Pipeline 流水线执行路由上绑定的中间件及对应的方法

在`runRouteWithinStack`方法中,系统会判断是否需要执行中间件,如果`IOC`容器中设置了`middleware.disable`的值为`true`,则需要执行的中间件数组为空;否则会找到所有的中间件,并按照`middlewarePriority`对必要的一些中间件进行排序调整;然后执行`$route->run()`方法;

5、根据 request 请求设置 response 的响应头

项目中会用到的一些方法

获取路由集合 app('router')->getRoutes()

获取当前的请求 $request = app('router')->getCurrentRequest()

获取当前请求所对应的路由 $route = $request->route() 或 $route = app('router')->getCurrentRoute()

获取当前路由需要执行的中间件 $middlewares = app('router')->gatherRouteMiddleware($route)

Url 生成器

Url 生成器是什么?

举个例子,

$url = new UrlGenerator( $routes = new RouteCollection, $request = Request::create('http://www.foo.com/') ); $url->to('foo/bar'); // 输出

像这种基于当前请求,生成指定路径的Url;

这部分功能由两个文件完成,一个是UrlGenerator.php,另一个是RouteUrlGenerator.php;UrlGenerator.php处理根据路径名生成Url,RouteUrlGenerator.php处理根据路由生成Url;

列一些常用的使用:

根据路径名生成

使用to方法,第一个参数为路径,第二个参数是数组,implode后会接着路径名,第三个参数决定用不用https

// 路径名是 foo/bar,当前请求的根路径为 ,所以输出是 $url->to('foo/bar') // 路径名是 foo/bar,当前请求的根路径为 ,第三个参数决定 scheme 是 https,所以输出是 https://www.foo.com/foo/bar $url->to('foo/bar', [], true) // 路径名是 foo/bar,第二个参数 是补充路径名,implode 后是 /baz/boom // 第三个参数决定 scheme 是 https,所以输出是 https://www.foo.com/foo/bar/baz/boom $url->to('foo/bar', ['baz', 'boom'], true) // 路径名是 foo/bar,查询参数是 ?foo=bar ,补充路径是 /baz,所以输出是 https://www.foo.com/foo/bar/baz?foo=bar $url->to('foo/bar?foo=bar', ['baz'], true)

根据路由的 as 名生成

使用route方法,第一个参数为指定路由的 as 名,第二个参数是参数数组,第三个参数决定是否显示根目录(默认为 true)

$route = new Route(['GET'], 'foo/bar', ['as' => 'foo']); $routes->add($route); // 输出 'http://www.foo.com/foo/bar $url->route('foo'); // 第三个参数为 false,表示不显示根目录,于是输出 /foo/bar $url->route('foo', [], false) // 路由中的 url 本身不带参数,则第二参数中所有关联数组都将作为查询参数 // 输出 /foo/bar?foo=bar $url->route('foo', ['foo' => 'bar'], false)

$route = new Route(['GET'], 'foo/bar/{baz}/breeze/{boom}', ['as' => 'bar']); $routes->add($route); // 路由上的 url 带参数,根据参数名找值;剩余多余的为查询参数; // 输出 ?fly=wall $url->route('bar', ['boom' => 'taylor', 'baz' => 'otwell', 'fly' => 'wall']); // 路由上的 url 带参数,找不到对应的参数值,则按顺序作值;剩余多余的为查询参数; // 输出 ?fly=wall $url->route('bar', ['taylor', 'otwell', 'fly' => 'wall']);

根据路由的 action 名生成

使用action方法,第一个参数为指定路由的 action 名,第二个参数是参数数组,第三个参数决定是否显示根目录(默认为 true)

$route = new Route(['GET'], 'foo/bam', ['controller' => 'foo@bar']); $routes->add($route); // 输出 $url->action('foo@bar');

$route = new Route(['GET'], 'foo/invoke', ['controller' => 'InvokableActionStub']); $routes->add($route); // 输出 $url->action('InvokableActionStub');

设置全局默认参数

$url->defaults(['locale' => 'en']); $route = new Route(['GET'], 'foo', ['as' => 'defaults', 'domain' => '{locale}.example.com', function() {}]); // 路由 url 有参数,但没有传参数值,则会找全局默认参数值;输出 $url->route('defaults');

设置全局命名空间

这样调用的时候,不用在 action 上省略这部分命名空间

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/85b244949445a7ecf2150e8d13b4f131.html