HTTP routing 可以动态添加吗?一起来看看

看了一个第三方'Mews\Captcha的库,其中provider这么写的

// HTTP routing
    if (strpos($this->app->version(), 'Lumen') !== false) {
       $this->app->get('captcha[/{config}]', 'Mews\Captcha\LumenCaptchaController@getCaptcha');
    } else {
        if ((double) $this->app->version() >= 5.2) {
            $this->app['router']->get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha')->middleware('web');
        } else {
            $this->app['router']->get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha');
        }
    }

疑问是:发布之后,web下面的web.php并没有新增路由配置。事实上,路由(captcha/{config?})生效了,如何做到的呢?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

你贴的这段代码就是把路由注册了啊

// HTTP routing
if (strpos($this->app->version(), 'Lumen') !== false) {
    $this->app->get('captcha[/{config}]', 'Mews\Captcha\LumenCaptchaController@getCaptcha');
    // lumen的路由,没用过lumen不太清楚,但是和下面的是一个意思
} else {
    if ((double)$this->app->version() >= 5.2) {
        // 等于在web.php中写Route::get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha')->middleware('web');
        $this->app['router']->get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha')->middleware('web');
    } else {
        // 等于在web.php中写Route::get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha');
        $this->app['router']->get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha');
    }
}

laravel的核心概念服务容器了解一下,这里的$this->app['router']就等于你web.php里面的Route

5年前 评论
讨论数量: 3

你贴的这段代码就是把路由注册了啊

// HTTP routing
if (strpos($this->app->version(), 'Lumen') !== false) {
    $this->app->get('captcha[/{config}]', 'Mews\Captcha\LumenCaptchaController@getCaptcha');
    // lumen的路由,没用过lumen不太清楚,但是和下面的是一个意思
} else {
    if ((double)$this->app->version() >= 5.2) {
        // 等于在web.php中写Route::get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha')->middleware('web');
        $this->app['router']->get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha')->middleware('web');
    } else {
        // 等于在web.php中写Route::get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha');
        $this->app['router']->get('captcha/{config?}', '\Mews\Captcha\CaptchaController@getCaptcha');
    }
}

laravel的核心概念服务容器了解一下,这里的$this->app['router']就等于你web.php里面的Route

5年前 评论

laravel的核心概念服务容器了解一下,这里的$this->app['router']就等于你web.php里面的Route

多谢回答。

我的疑问是: $this->app['router']->get('captcha/{config?}' 这个 是在provider中写的,理论上只被执行一次,但是没有被持久化,每次是如何生效的呢?

5年前 评论

@codewithyou 这里没有「持久化」,即使 web.php 里也没有,而是你说的「只被执行了一次」。感觉你的疑问是一个请求的生命周期,可以参考文档 https://learnku.com/docs/laravel/5.6/lifec...

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!