2016-05-18 3 views
3

Я строю проект в Laravel 5.2, который имел большой (большой, как во многих строках) routes.php. Чтобы сделать маршруты немного чистыми для глаз, я разделил все группы маршрутов, разделенные вложенными файлами. В app\Http\Routes\.Ключ маршрута Laravel на пользовательских файлах маршрутов

Мне нужны все файлы в 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(); 
      } 
     } 
    }); 
} 

знает кто-то, в чем проблема? Или мне просто нужно все вернуть в route.php, если я хочу использовать кеширование маршрута. Заранее спасибо.

ответ

3

TL; Используйте require вместо require_once, и вы должны быть в порядке.

Итак, для начала давайте посмотрим на 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); 

Это позволяет нам иметь больше понимания о том, сколько маршрутах неправдоподобные.

С вашим кодом, независимо от того, сколько файлов я добавил в папку Http\Routes, ни одна из них не была зарегистрирована. Итак, я решил попробовать «require» вместо «require_once». И вуаля!

Количество маршрутов увеличено соответствующим образом.

Относительно того, почему это происходит, я предполагаю, что это из-за автозагрузки композитора (это всего лишь образованное предположение). Взгляните на composer.json:

"psr-4": { 
     "App\\": "app/" 
    } 

Это означает, что файлы в приложение/папке автоматически загружены. Это означает, что эти файлы уже загружены, просто не на месте, что вы хотите. Это означает, что они не будут загружаться снова, если вы используете функции включения *_once.

код в RouteServiceProvider.php, метод map, который работал для меня:

$router->group(['namespace' => $this->namespace], function ($router) { 
     // Dynamically include all files in the routes directory 
     foreach (new \DirectoryIterator(app_path('Http/Routes')) as $file) 
     { 
      $path = app_path('Http/Routes').DIRECTORY_SEPARATOR.$file->getFilename(); 
      if ($file->isDot() || $file->isDir() || $file->getFilename() == '.gitignore') 
       continue; 

      require $path; 
      $included[] = $path; 
     } 
    }); 
+0

Чтобы долго, не читал;). Но это сработало, а ура! –

Смежные вопросы