这节,我们承接上节继续研读Slim路由部分。我们首先由map函数进行延伸,因为get()、post()、any()等函数均是封装的此函数。
/**
* 使用多种请求方法增加路由
* Add route with multiple methods
*
* @param string[] $methods Numeric array of HTTP method names
* @param string $pattern The route URI pattern
* @param callable|string $callable The route callback routine
*
* @return RouteInterface
*/
public function map(array $methods, $pattern, $callable)
{
// 回调函数实现自闭包类
if ($callable instanceof Closure) {
$callable = $callable->bindTo($this->container);
}
// Slim默认服务曾注册了Router服务。这里我们返回了router对象的map()方法。
$route = $this->container->get('router')->map($methods, $pattern, $callable);
// 在注册router时,曾使用过$router->setContainer($container)方法,这里是不是有重复?
// 还是有其他寓意呢?
if (is_callable([$route, 'setContainer'])) {
$route->setContainer($this->container);
}
// 设置输出缓冲模式
if (is_callable([$route, 'setOutputBuffering'])) {
$route->setOutputBuffering($this->container->get('settings')['outputBuffering']);
}
// 返回处理后的路由实例
return $route;
}
首先看第一段,该段意思是复制当前$callable闭包对象,绑定指定的$this对象到$this->container对象中。也就是说$callable闭包函数中的$this等价于$this->container中的$this。
// 回调函数实现自闭包类
if ($callable instanceof Closure) {
$callable = $callable->bindTo($this->container);
}
查看下一段,前面我们曾在app构造函数中注册了路由,然我们继续进入路由查看
// Slim默认服务曾注册了Router服务。这里我们返回了router对象的map()方法。
$route = $this->container->get('router')->map($methods, $pattern, $callable);
让我们查看$this->container->get('router')返回值。在应用主体启动时曾注册了一些默认服务提供者,包括Router
if (!isset($container['router'])) {
/**
* This service MUST return a SHARED instance
* of \Slim\Interfaces\RouterInterface.
*
* @param Container $container
*
* @return RouterInterface
*/
$container['router'] = function ($container) {
$routerCacheFile = false;
// 从配置文件中得到路由缓存文件地址
if (isset($container->get('settings')['routerCacheFile'])) {
$routerCacheFile = $container->get('settings')['routerCacheFile'];
}
// 设置路由缓存文件地址
// 这种new出对象的写法也是极有意思的
// setCacheFile执行后返回Router实例自身
$router = (new Router)->setCacheFile($routerCacheFile);
// 将依赖注入容器设置为$router的container属性
if (method_exists($router, 'setContainer')) {
$router->setContainer($container);
}
return $router;
};
}
下节,让我们继续查看Slim\Router类的map方法。