2016-06-03 3 views
0

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

Позвольте мне показать, что я сделал.

Моя структура папок

enter image description here

Мои ModuleServiceProvider.php

namespace App\Modules; 

class ModulesServiceProvider extends \Illuminate\Support\ServiceProvider 
{ 
    /** 
    * Will make sure that the required modules have been fully loaded 
    * @return void 
    */ 

    public function boot() 
    { 

     if ($module = $this->getModule(func_get_args())) { 
      include __DIR__.'/'.$module.'/routes.php'; 
     } 
     $this->loadViewsFrom(__DIR__.'/'.$module.'/Views', 'core'); 
    } 

    public function register() 
    { 
     if ($module = $this->getModule(func_get_args())) { 

     } 
    } 

    public function getModule($args) 
    { 
     $module = (isset($args[0]) and is_string($args[0])) ? $args[0] : null; 

     return $module; 
    } 
} 

Мои BlogServiceProvider.php

namespace App\Modules\Blog; 

class BlogServiceProvider extends \App\Modules\ModulesServiceProvider { 

    public function register() 
    { 
     parent::register('Blog'); 
    } 

    public function boot() 
    { 
     parent::boot('Blog'); 
    } 
} 

в приложении \ Config \ app.php

'App\Modules\Blog\BlogServiceProvider', // добавлены в массив поставщиков

в приложении \ Config

module.php созданный

return [ 
    'modules' => [ 
     'Blog', 
    ] 
]; 

в composer.json

"autoload": { 
     "classmap": [ 
      "database", 
      "app/Modules" 
     ], 
     "psr-4": { 
      "App\\": "app/", 
      "Modules\\": "Modules/" 
     } 
    }, 

Все кажется совершенным, но в я в ловушке в маршрутах.

в моем приложении \ Modules \ Блог \ routes.php

Route::group(['namespace' => array('Modules\Blog')], function() { 
     Route::get('/',['as' => 'home', 'uses' => '[email protected]']); 
    }); 
Route::get('/', ['as' => 'home', 'uses' => 'App\Modules\Blog\Controllers\[email protected]']); 

Я получаю PostController не существует ошибки

Моих имена контроллера

namespace App\Modules\Blog\Controllers; 

Я получаю эту ошибку по обоим маршрутам. я указываю путь контроллера или нет. любая помощь пожалуйста. Как проложить маршрут в модульном приложении.

+0

Я думаю, что эта строка на вашем composer.json: '" Модули \\ ":" Модули/"' должны быть '' Модули \\ ":" app/Modules/"' вместо этого. И не забудьте сделать 'composer dump-autoload'. Изменить: см. Ответ @Ruffles. У вас уже есть папка «Модули» внутри приложения /. – Doom5

ответ

0

Попробуйте изменить пространство имен в группе маршрутов из ['namespace' => array('Modules\Blog')] в ['namespace' => 'App\Modules\Blog\Controllers'] и посмотреть, если он работает.

+0

, который не работает – Dhara

0

Редактировать файл composer.json и исправить PRS-4 автозагрузку в:

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

обновления пространства имен ваших файлов от удаления "App \" и сделать композитор dump-autoload

+0

Это работает, но когда я пишу 'Route :: get ('new-post', ['as' => 'homenew', 'uses' => 'App \ Modules \ Blog \ Controllers \ PostController @ создать ']); '. Это дает мне ошибку, запрашиваемой странице не работает. – Dhara

+0

Try 'uses' => '\ Modules \ Blog \ Controllers \ PostController @ create']) – zeoce

0

Перейти к методу карты на вашем RouteServiceProvider. Вы можете указать laravel для загрузки ваших маршрутов в зависимости от пространства имен.

$router->group(['namespace' => 'App\Controllers'], function ($router) { 
     require app_path('Http/routes.php'); 
    }); 

$router->group(['namespace' => 'App\Modules\MyModuleControllers'], function ($router) { 
     require app_path('Modules/MyModule/routes.php'); 
    }); 
+0

не работает. нам нужно определить один и тот же маршрут в родительском приложении \ Http \ route.php? Если я использую тот же маршрут в app \ Http \ route.php, это работает. но в Blog \ routes.php не работает – Dhara

+0

здесь мы говорим laravel, чтобы посмотреть маршрут и загрузить соответствующий класс контроллера. Если у вас несколько пространств имен (несколько модулей), вам нужно будет их закодировать и вызвать это несколько раз. нет необходимости определять одни и те же маршруты в основных маршрутах.php. проблема должна быть в правильном разрешении пространства имен. перед проверкой маршрута убедитесь, что пространство имен классов модуля блога можно разрешить. – astroanu

+0

Не знаю, что не так. но при добавлении 'require_once base_path()."/app/Modules/Blog/routes.php "в main route.php. оно работает. – Dhara

0

Наконец-то я получил решение от этого. я изменил ModuleServiceProvider

namespace App\Modules; 

class ModulesServiceProvider extends \Illuminate\Support\ServiceProvider 
{ 
    /** 
    * Will make sure that the required modules have been fully loaded 
    * @return void 
    */ 

    public function boot() 
    { 

     if ($module = $this->getModule(func_get_args())) { 
      require_once __DIR__.'/'.$module.'/routes.php'; 
     } 
     $this->loadViewsFrom(__DIR__.'/'.$module.'/Views', 'core'); 
    } 

    public function register() 
    { 
     if ($module = $this->getModule(func_get_args())) { 

     } 
    } 

    public function getModule($args) 
    { 
     $module = (isset($args[0]) and is_string($args[0])) ? $args[0] : null; 

     return $module; 
    } 
} 

я заменил require_once вместо include в boot функции. И его работа.

В пути я даю

Route::get('new-post',['uses' => 'App\Modules\Blog\Controllers\[email protected]']); 

Надеется, что это помогает другим !!

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