今天继续学习Router类的功能,今天主要说下map函数
public function map($methods, $pattern, $handler)
{
if (!is_string($pattern)) {
throw new InvalidArgumentException('Route pattern must be a string');
}
// Prepend parent group pattern(s)
if ($this->routeGroups) {
$pattern = $this->processGroups() . $pattern;
}
//array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
//回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
//这里就是把$methods 转换成小写
// According to RFC methods are defined in uppercase (See RFC 7231)
$methods = array_map("strtoupper", $methods);
// Add route
$route = $this->createRoute($methods, $pattern, $handler);
$this->routes[$route->getIdentifier()] = $route;
$this->routeCounter++;
return $route;
}
这里看一下processGroups()方法。该方法,主要是把 routeGroups
protected function processGroups()
{
$pattern = "";
foreach ($this->routeGroups as $group) {
$pattern .= $group->getPattern();
}
return $pattern;
}
重点在看下 createRoute 方法
protected function createRoute($methods, $pattern, $callable)
{
$route = new Route($methods, $pattern, $callable, $this->routeGroups, $this->routeCounter);
if (!empty($this->container)) {
$route->setContainer($this->container);
}
return $route;
}
奇怪,这里为什么会有一个 new Route()。这里的Route到底指什么,我们一起看下
Slim/Route.php
class Route extends Routable implements RouteInterface
{
public function __construct($methods, $pattern, $callable, $groups = [], $identifier = 0)
{
$this->methods = is_string($methods) ? [$methods] : $methods;
$this->pattern = $pattern;
$this->callable = $callable;
$this->groups = $groups;
$this->identifier = 'route' . $identifier;
}
.......
}
今天就到这里,明天我们在看 Slim/Route.php 的内容