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?})生效了,如何做到的呢?

codewithyou
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

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

// 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

1年前 评论
讨论数量: 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

1年前 评论
codewithyou

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

多谢回答。

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

1年前 评论

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

1年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会