2016-06-03 8 views
0

Ich weiß, es gibt Frage/Antwort für das Routing in Modulen. Aber ich habe alles versucht, aber ich kann keine Problemumgehung bekommen.Wie routing in Laravel modulare Anwendung

Lassen Sie mich zeigen, was ich getan habe.

Meine Ordnerstruktur

enter image description here

Mein 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; 
    } 
} 

Mein BlogServiceProvider.php

namespace App\Modules\Blog; 

class BlogServiceProvider extends \App\Modules\ModulesServiceProvider { 

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

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

in app \ config \ app.php

'App\Modules\Blog\BlogServiceProvider', // in Anbieter Array hinzugefügt

in app \ config

module.php erstellt

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

in composer.json

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

Alles scheint perfekt, aber in i gefangen in Routen.

in meiner app \ Modules \ Blog \ 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]']); 

Ich bin immer Postcontroller existiert nicht Fehler

Mein Controller-Namespace

namespace App\Modules\Blog\Controllers; 

Ich erhalte diesen Fehler auf beiden Routen. ob ich Controller-Pfad angeben oder nicht. jede Hilfe bitte. Wie in einer modularen Anwendung zu routen.

+0

Ich denke, diese Zeile auf Ihrem composer.json: '" Module \\ ":" Module/"' sollte '" Module \\ ":" app/Module/"' statt. Und vergiss nicht, 'composer dump-autoload' zu machen. Bearbeiten: Siehe @Ruffle Antwort. Sie haben den Ordner Module bereits in der App /. – Doom5

Antwort

0

Versuchen Sie, den Namensraum in der Routengruppe von ['namespace' => array('Modules\Blog')] zu ['namespace' => 'App\Modules\Blog\Controllers'] verändern und sehen, ob es funktioniert.

+0

das funktioniert nicht – Dhara

0

Bearbeiten Sie Ihre composer.json Datei und korrigieren Sie Ihre prs-4 automatisch geladen zu:

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

Aktualisierung der Namespaces Ihrer Dateien durch den "App \" Entfernen und Do Composer dump-autoload

+0

Das funktioniert aber wenn ich schreibe 'Route :: get ('neu-post', ['as' => 'homenew', 'uses' => 'App \ Module \ Blog \ Controller \ PostController @ create ']); '. Das gibt mir Fehler Seite nicht funktioniert. – Dhara

+0

Probieren Sie 'uses' => '\ Module \ Blog \ Controller \ PostController @ create']) – zeoce

0

Gehen Sie zu der Kartenmethode auf Ihrem RouteServiceProvider. Sie können laravel anweisen, Ihre Routen abhängig vom Namespace zu laden.

$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

funktioniert nicht. Müssen wir dieselbe Route in der übergeordneten App \ Http \ route.php definieren? Wenn ich dieselbe Route in App \ Http \ route.php verwende, funktioniert das. aber in Blog \ routes.php funktioniert nicht – Dhara

+0

hier sagen wir Laravel, um die Route zu betrachten und die entsprechende Controller-Klasse zu laden. Wenn Sie mehrere Namespaces (mehrere Module) haben, müssen Sie diese mehrfach durchlaufen und mehrmals aufrufen. keine Notwendigkeit, die gleichen Routen in den Haupt routes.php zu definieren. Ihr Problem muss sein, dass der Namespace nicht korrekt aufgelöst wird. Stellen Sie vor dem Überprüfen der Route sicher, dass der Klassenraum für Blog-Module aufgelöst werden kann. – astroanu

+0

weiß nicht, was falsch ist. aber wenn '' require_once base_path(). "/ app/Modules/Blog/routes.php" 'in der main route.php. Es klappt. – Dhara

0

Endlich habe ich eine Lösung durch diese. i geändert 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; 
    } 
} 

I ersetzt require_once statt include in boot Funktion. Und es funktioniert.

In Route Ich gebe

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

Hoffe, dass es anderen hilft !!