Laravel路由缓存自定义路由文件

时间:2016-05-18 13:08:03

标签: php laravel caching laravel-5 laravel-routing

我在Laravel 5.2中建立了一个项目,它有一个很大的(很多行很多)routes.php。为了使眼睛的路线更清洁,我将所有路线组分开介绍分开的文件。在app\Http\Routes\

我要求RouteServiceProvider中的所有文件(修正:工作..)对我来说完全没问题。毕竟,我想用php artisan route:cache缓存路由。然后,如果你去了一个页面,你得到的是404错误。

“长”故事简短:新的路线逻辑在工匠路线缓存后崩溃。

这是RouteServiceProvider中的地图功能(灵感来自this答案):

public function map(Router $router)
{
    $router->group(['namespace' => $this->namespace], function ($router) {
        // Dynamically include all files in the routes directory
        foreach (new \DirectoryIterator(app_path('Http/Routes')) as $file)
        {
            if (!$file->isDot() && !$file->isDir() && $file->getFilename() != '.gitignore')
            {
                require_once app_path('Http/Routes').DS.$file->getFilename();
            }
        }
    });
}

有人知道问题是什么吗?或者,如果我想使用路由缓存,我只需要将所有内容放回routes.php中。提前谢谢。

1 个答案:

答案 0 :(得分:6)

TL; DR:使用require代替require_once,你应该没问题。

所以,对于初学者,让我们来看看$results = \DB::select( \DB::raw(" SELECT SUM(T1.total) AS Total, SUM(T1.received) AS Received, T1.EventName, T1.CurrencyType FROM ( SELECT event_invoice.Id, event_invoice.Amount AS total, SUM(payments.recieved_amount + payments.adjust_amount) AS received, event_invoice.EventName, event_invoice.CurrencyType FROM event_invoice LEFT JOIN payments ON event_invoice.Id = payments.invoice_id GROUP BY event_invoice.Id ORDER BY event_invoice.Id ) T1 GROUP BY T1.EventName, T1.CurrencyType ") ); 您会注意到它使用Illuminate\Foundation\Console\RouteCacheCommand方法来引导应用程序并从路由器获取路由。

我已经使用此代码创建了一个命令,可以对路径进行计数:

getFreshApplicationRoutes

这使我们能够更多地了解提取的路线数量。

使用您的代码,无论我在$app = require $this->laravel->bootstrapPath().'/app.php'; $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); $routesCnt = $app['router']->getRoutes()->count(); $this->info($routesCnt); 文件夹中添加了多少文件,都没有注册。 所以我决定尝试使用"要求"而不是" require_once"。 瞧!

路线数量适当增加。

至于为什么会发生这种情况,我猜测它是因为作曲家自动加载(这只是一个有根据的猜测)。 看看composer.json:

Http\Routes

这意味着app /文件夹中的文件是自动加载的。这意味着这些文件已经加载,只是没有你想要的文件。 这意味着如果您使用 "psr-4": { "App\\": "app/" } 包含功能,他们将无法再次加载。

*_once中的代码,方法RouteServiceProvider.php对我有效:

map