2015-12-21 3 views
0

В некотором контексте: я установил приложение Laravel 5 для разделения на модули. Функция загрузки() в моем AppServiceProvider выглядит следующим образом:Глобальный маршрут в Laravel 5

public function boot() 
{ 
    // We want to register the modules in the Modules folder 
    $modulesPath = app_path() . '/Modules'; 
    $handle  = opendir($modulesPath); 

    // Loop through the module directory and register each module 
    while (($module = readdir($handle)) !== false) { 
     if ($module != "." && $module != ".." && is_dir("{$modulesPath}/{$module}")) { 
      // Check if there are routes for that module, if so include 
      if (file_exists($modulesPath . '/' . $module . '/routes.php')) { 
       include $modulesPath . '/' . $module . '/routes.php'; 
      } 

      // Check if there are views for that module, if so set a namespace for those views 
      if (is_dir($modulesPath . '/' . $module . '/Views')) { 
       $this->loadViewsFrom($modulesPath . '/' . $module . '/Views', strtolower($module)); 
      } 
     } 
    } 
} 

Идея заключается в том, чтобы быть в состоянии держать вещи, разделенные в модулях, но и глобальные маршруты и глобальный контроллер. Таким образом, каждый модуль имеет свой собственный файл routes.php, который выглядит примерно так:

<?php 

Route::group(array('module'=>'MyModule','namespace' => 'NexusHub\Modules\MyModule\Controllers'), function() { 
    Route::resource('mymodule', 'MyModuleController'); 
}); 

Я тогда глобальный файл routes.php который выглядит следующим образом:

<?php 

Route::any('{catchall}', '[email protected]')->where('catchall', '(.*)'); 

Route::group(array('module'=>'Global'), function() { 
    Route::resource('', 'GlobalController'); 
}); 

Проблема Я что я вижу, что мой маршрут не собирает модули. Модули запускают собственные маршруты, но основной путь игнорируется.

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

UPDATE: Удалена строка, включающая глобальные маршруты, так как я понял, что они по умолчанию включены.

+1

Вы пробовали включить ваши глобальные маршруты после того, как вы включили маршруты вашего модуля? – nrivero

+0

Просто попробовал, неважно. Я также понял, что мне даже не нужна эта строка, глобальный файл маршрута загружается независимо от того, включает ли app_path(). '/Http/routes.php'; линия на самом деле не нужна. И если я удалю его, глобальные маршруты по-прежнему будут включены после модулей. – Rocket04

+0

Из вашего описания, если вы просто пытаетесь вставить некоторые данные в _all_ маршруты/представления, то это похоже на то, что композиции для представления являются более подходящим решением. –

ответ

0

Я закончил тем, что хотел использовать промежуточное ПО вместо этого (см. https://laravel.com/docs/master/middleware#global-middleware).

В моем случае я использовал что-то похожее на пример класса BeforeMiddleware и зарегистрировал его в свойстве $ middleware моего приложения/Http/Kernel.php, так как он глобальный и не зависит от маршрута.

+0

Не могли бы вы обобщить ваше решение? –

+0

Хорошо, я обновил ответ, чтобы указать людям в правильном направлении. – Rocket04

0

Сначала загружается ваш файл глобальных маршрутов.

Попробуйте переместить поставщика услуг, который загружает все маршруты вашего модуля до «App \ Providers \ RouteServiceProvider» в файле config/app.php.

... посмотрите если это поможет.

+0

См. Мои комментарии к вашему комментарию выше, я попытался переместить его, и это не устранило проблему. Я также удалил загрузку глобальных маршрутов из функции boot(), поскольку я понял, что глобальные маршруты загружаются в любом случае, и файл включается после файлов модулей. – Rocket04

+0

MMmm ... попробуйте объявить ваш поймать весь маршрут в приложении :: перед фильтром приложения. – nrivero

+0

Могу сказать, что я действительно знаю, что вы подразумеваете под App :: before filter. Но впечатление, которое я получаю, заключается в том, что то, что я пытаюсь сделать, не будет работать с маршрутами. Глядя на функции в классе Router, кажется, что вы только когда-либо получаете один маршрут, который подбирается.Если это правда, тогда мне просто нужно придумать другой подход. – Rocket04

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