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

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

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

// 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年前 评论

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年前 评论

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