Ich möchte meine Bewerbung in Module aufteilen. Zum Beispiel würde es ein "Kern" -Modul geben, das die grundlegenden Anmeldefunktionen, das App-Layout / die App-Formatierung (CSS usw.), die Benutzerverwaltung und ein Tagebuch enthält.
Später kann ich andere Module wie einen Kontaktmanager erstellen, die einfach zur Anwendung hinzugefügt oder daraus entfernt werden können.
Die Apps-Navigation enthält eine gewisse Logik, um festzustellen, welche Module vorhanden sind, und um die Links zu diesen ein- / auszublenden.
Wie kann ich dies in Bezug auf Verzeichnisstruktur, Namespaces und alles andere tun, was benötigt wird?
Ich betrachte Creolab / Laravel-Module, aber es heißt, dass es für Laravel 4 ist. Kann ich es mit 5 immer noch genauso verwenden?
In der Dokumentation wird angegeben, dass Modelle, Controller und Ansichten in jedem Modulverzeichnis platziert werden sollen. Wie funktioniert dies jedoch mit Routen? Idealerweise möchte ich, dass jedes Modul eine eigene Datei route.php hat. Wie wird das alles mit den Sachen im http
und im resources
Verzeichnis funktionieren ?
Ich dachte an so etwas:
Aber ich habe keine Ahnung, wie ich es zum Laufen bringen würde.
Ich habe gerade das Tutorial hier ausprobiert:
http://creolab.hr/2013/05/modules-in-laravel-4/
Ohne zusätzliche Bibliotheken usw., nur reines Laravel 5.
Ich habe anscheinend eine Mauer mit einer Fehlermeldung getroffen:
FatalErrorException in ServiceProvider.php line 16:
Call to undefined method Illuminate\Config\Repository::package()
In Bezug auf Folgendes:
<?php namespace App\Modules;
abstract class ServiceProvider extends \Illuminate\Support\ServiceProvider
{
public function boot()
{
if ($module = $this->getModule(func_get_args())) {
$this->package('app/' . $module, $module, app_path() . '/modules/' . $module);
}
}
public function register()
{
if ($module = $this->getModule(func_get_args())) {
$this->app['config']->package('app/' . $module, app_path() . '/modules/' . $module . '/config');
// Add routes
$routes = app_path() . '/modules/' . $module . '/routes.php';
if (file_exists($routes)) require $routes;
}
}
public function getModule($args)
{
$module = (isset($args[0]) and is_string($args[0])) ? $args[0] : null;
return $module;
}
}
Was verursacht das und wie kann ich es beheben?
Ich habe mich jetzt ein bisschen mehr damit beschäftigt. Ich habe meine Paket- / Modulrouten und -ansichten zum Laufen gebracht, was großartig ist:
abstract class ServiceProvider extends \Illuminate\Support\ServiceProvider
{
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;
}
}
Ich habe noch eine letzte Frage: Wie würde ich alle meine Controller aus meinem Paket laden, ähnlich wie die loadViewsFrom()
Methode funktioniert?
quelle
Antworten:
Ich scheine alles herausgefunden zu haben.
Ich werde es hier posten, falls es anderen Anfängern hilft. Es ging nur darum, die Namespaces richtig zu machen.
In meiner composer.json habe ich:
... "autoload": { "classmap": [ "database", "app/Modules" ], "psr-4": { "App\\": "app/", "Modules\\": "Modules/" } }
Mein Verzeichnis und meine Dateien endeten wie folgt:
Ich habe mein Kernmodul router.php zum Laufen gebracht, indem ich meine Controller für dieses Modul in eine Gruppe eingeschlossen habe, die den Namespace angibt:
Route::group(array('namespace' => 'Modules\Core'), function() { Route::get('/test', ['uses' => 'TestController@index']); });
Ich stelle mir vor, wenn ich meine Modelle für das Paket mache, wird es ein ähnlicher Fall sein, die Namespaces richtig zu machen.
Vielen Dank für all Ihre Hilfe und Geduld!
quelle
Lösung:
Inside admin module : create the following folder 1. Controllers (here will your controller files) 2. Views (here will your View files) 3. Models (here will your Model files) 4. routes.php (here will your route code in this file)
Ebenso können Sie mehrere Module erstellen
<?php namespace App\Modules; /** * ServiceProvider * * The service provider for the modules. After being registered * it will make sure that each of the modules are properly loaded * i.e. with their routes, views etc. * * @author kundan Roy <query@programmerlab.com> * @package App\Modules */ use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; class ModulesServiceProvider extends ServiceProvider { /** * Will make sure that the required modules have been fully loaded * * @return void routeModule */ public function boot() { // For each of the registered modules, include their routes and Views $modules=config("module.modules"); while (list(,$module)=each($modules)) { // Load the routes for each of the modules if (file_exists(DIR.'/'.$module.'/routes.php')) { include DIR.'/'.$module.'/routes.php'; } if (is_dir(DIR.'/'.$module.'/Views')) { $this->loadViewsFrom(DIR.'/'.$module.'/Views',$module); } } } public function register() { } }
<?php return [ 'modules'=>[ 'admin', 'web', 'api' ] ];
Hinweis: Sie können Ihren Modulnamen hinzufügen, je nachdem, was Sie erstellt haben. Hier gibt es Module.
quelle
Ein bisschen spät, aber wenn Sie Module in Ihren zukünftigen Projekten verwenden möchten, habe ich einen Modulgenerator geschrieben. Es generiert Module über
php artisan make:module name
Sie können auch einfach einige Module in denapp/Modules
Ordner legen und sie sind einsatzbereit / arbeiten. Schau mal. Sparen Sie etwas Zeit;)l5-modular
quelle
app/config/modules.php
Datei deaktivieren . Wenn Sie Ihre Module dynamisch verwalten müssen, würde ich empfehlen, mein Git zu teilen und dieModuleServiceProvider.php
(Zeile 19) so anzupassen, wie Sie es benötigen (FA. Holen Sie sich Ihre Modul-Ladeliste von der DB).modules.enable
Konfiguration auch zur Laufzeit festlegen . FA.config(['modules.enable' => ['customer', 'contract', 'reporting']]);
require
Knoten einfügen . genau wie jedes andere PHP-Paket, das Sie über Composer installiert haben. WerfenSie können auch Pingpong-Labs verwenden
Dokumentationen hier .
Hier ist ein Beispiel.
Sie können den Prozess einfach installieren und überprüfen.
Hinweis: Ich mache keine Werbung. Ich habe gerade überprüft, ob cms auf Laravel mit Modulunterstützung erstellt wurde. Ich dachte, das könnte für Sie und andere hilfreich sein.
quelle
Kundan roy: Ich mochte Ihre Lösung, aber ich habe Ihren Code von StackOverflow kopiert. Ich musste die Anführungszeichen und Semi-Anführungszeichen ändern, damit es funktioniert - ich denke, SOF ersetzt diese. Außerdem wurde Dir für base_path () geändert, um dem (neuen) Format von Laravel besser zu entsprechen.
namespace App\Modules; /** * ServiceProvider * * The service provider for the modules. After being registered * it will make sure that each of the modules are properly loaded * i.e. with their routes, views etc. * * @author kundan Roy <query@programmerlab.com> * @package App\Modules */ use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; class ModulesServiceProvider extends ServiceProvider { /** * Will make sure that the required modules have been fully loaded * @return void routeModule */ public function boot() { // For each of the registered modules, include their routes and Views $modules = config("module.modules"); while (list(,$module) = each($modules)) { // Load the routes for each of the modules if(file_exists(base_path('app/Modules/'.$module.'/routes.php'))) { include base_path('app/Modules/'.$module.'/routes.php'); } // Load the views if(is_dir(base_path('app/Modules/'.$module.'/Views'))) { $this->loadViewsFrom(base_path('app/Modules/'.$module.'/Views'), $module); } } } public function register() {} }
quelle
pingpong/modules
ist ein Laravel-Paket, das erstellt wurde, um Ihre große Laravel-App mithilfe von Modulen zu verwalten. Das Modul ist wie ein Laravel-Paket für eine einfache Struktur, es hat einige Ansichten, Controller oder Modelle.Es funktioniert sowohl in Laravel 4 als auch in Laravel 5.
Um über Composer zu installieren, fügen Sie einfach Folgendes in Ihre
composer.json
Datei ein:{ "require": { "pingpong/modules": "~2.1" } }
Führen Sie dann aus
composer install
, um das Paket abzurufen.Um ein neues Modul zu erstellen, können Sie einfach Folgendes ausführen:
php artisan module:make <module-name>
- Erforderlich. Der Name des Moduls wird erstellt. Erstellen Sie ein neues Modul
php artisan module:make Blog
Erstellen Sie mehrere Module
php artisan module:make Blog User Auth
Weitere Informationen finden Sie unter: https://github.com/pingpong-labs/modules
quelle