Slim研读笔记八之路由(中)

本文深入剖析Slim框架中的路由机制,特别是map方法的实现细节。通过源码解读,理解如何使用多种HTTP请求方法定义路由,并探讨了回调函数绑定及依赖注入的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这节,我们承接上节继续研读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方法。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值