Laravel 未调用 RouteServiceProvider 映射函数

Laravel RouteServiceProvider map function not called

我正在使用 RouteServiceProvider 中的 map 函数在进一步处理之前操纵一些路由。 当我在我的本地机器上 运行 时一切正常 运行 但在生产服务器上由于某种原因没有调用地图函数。 为了确保错误不是出于某种原因出现在我自己的代码中,我使用了原始的 RouteServiceProvider.php 并添加了一些回声用于测试目的:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * The path to the "home" route for your application.
     *
     * @var string
     */
    public const HOME = '/home';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        //

        echo 'RouteServiceProvider boot';
        parent::boot();
    }

    /**
     * Define the routes for the application.
     *
     * @return void
     */
    public function map()
    {
        echo 'RouteServiceProvider map';
        $this->mapApiRoutes();

        $this->mapWebRoutes();

        //
    }

    /**
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapWebRoutes()
    {
        echo 'RouteServiceProvider mapWebRoutes';
        Route::middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));
    }

    /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        echo 'RouteServiceProvider mapApiRoutes';
        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));
    }
}

在生产服务器上 运行ning 时,我得到:

RouteServiceProvider boot

在本地机器上 运行ning 时:

RouteServiceProvider bootRouteServiceProvider mapRouteServiceProvider mapApiRoutesRouteServiceProvider mapWebRoutes

所以看起来在生产服务器上 class 被完美加载并且 boot 函数也被调用但是 map 函数的 none 被调用。 我尝试清除每种类型的缓存,但结果保持不变。但是在清除缓存期间它确实调用了所有地图函数:

php artisan route:cache
RouteServiceProvider bootRoute cache cleared!
RouteServiceProvider bootRouteServiceProvider mapRouteServiceProvider mapApiRoutesRouteServiceProvider mapWebRoutesRoutes cached successfully!

知道可能是什么原因或如何解决它吗?

PS 在生产服务器上,一切都使用 PHP Deployer 部署,但其他一切都 运行ning 正常,所以我认为这不是问题。

当你在生产中使用路由缓存时,map 不再被调用,因为它的目标是生成路由,并且这些路由被缓存了。如果您检查 Illuminate\Foundation\Support\Providers\RouteServiceProvider,您将看到:

/**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->setRootControllerNamespace();

        if ($this->routesAreCached()) {
            $this->loadCachedRoutes();
        } else {
            $this->loadRoutes();

            $this->app->booted(function () {
                $this->app['router']->getRoutes()->refreshNameLookups();
                $this->app['router']->getRoutes()->refreshActionLookups();
            });
        }
    }

    /**
     * Load the application routes.
     *
     * @return void
     */
    protected function loadRoutes()
    {
        if (method_exists($this, 'map')) {
            $this->app->call([$this, 'map']);
        }
    }

如果您查看框架默认的 RouteServiceProvider(不是您的应用程序扩展的那个),您将看到:

/**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->setRootControllerNamespace();

        if ($this->routesAreCached()) {
            $this->loadCachedRoutes();
        } else {
            $this->loadRoutes();

            $this->app->booted(function () {
                $this->app['router']->getRoutes()->refreshNameLookups();
                $this->app['router']->getRoutes()->refreshActionLookups();
            });
        }
    }

如您所见,if ($this->routesAreCached()) { 然后从缓存中加载路由,$this->loadRoutes(); 最终调用 RouteServiceProvider 的 map 函数。

如果你这样做 php artisan route:clear 它将停止从缓存中加载路线,并且你的地图方法将在每次请求时被调用。