Wie strukturiere ich eine modulare App in Laravel 5?

Lesezeit: 9 Minuten

Benutzer-Avatar
Imperium2335

Ich möchte meine Bewerbung in Module aufteilen. Beispielsweise gäbe es ein „Kern“-Modul, das die grundlegende Anmeldefunktionalität, App-Layout/Formatierung (CSS usw.), Benutzerverwaltung und ein Tagebuch enthält.

Später kann ich andere Module wie einen Kontaktmanager erstellen, die einfach zur Anwendung hinzugefügt oder aus ihr entfernt werden können.

Es würde eine gewisse Logik in der App-Navigation geben, um zu bestimmen, welche Module vorhanden sind, und um die Links zu ihnen anzuzeigen/auszublenden.

Wie kann ich dies in Bezug auf Verzeichnisstruktur, Namespaces und alles andere tun, was benötigt wird?


Ich schaue mir Creolab/Laravel-Module an, aber es heißt, dass es für Laravel 4 ist. Kann ich es immer noch mit 5 auf genau die gleiche Weise verwenden?

Die Dokumentation sagt, dass Modelle, Controller und Ansichten in jedem Modulverzeichnis platziert werden sollen, aber wie funktioniert das mit Routen? Idealerweise möchte ich, dass jedes Modul seine eigene Datei “routes.php” hat. Wie funktioniert das alles mit dem Zeug in der http und die resources Verzeichnis?


Ich dachte an so etwas:

Modulidee

Aber ich habe keine Ahnung, wie ich das zum Laufen bringen soll.


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 scheine mit einer Fehlermeldung auf eine Mauer gestoßen zu sein:

FatalErrorException in ServiceProvider.php line 16:
Call to undefined method Illuminate\Config\Repository::package()

Zu folgendem:

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

}

Woran liegt das und wie kann ich es beheben?


Hab mir das jetzt ein bisschen mehr durch den Kopf gehen lassen. Meine Paket-/Modulrouten und -ansichten funktionieren, was großartig ist:

abstract class ServiceProvider extends \Illuminate\Support\ServiceProvider
{

    public function boot()
    {
        if ($module = $this->getModule(func_get_args())) {
            include __DIR__."https://stackoverflow.com/".$module.'/routes.php';
        }
        $this->loadViewsFrom(__DIR__."https://stackoverflow.com/".$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 eine letzte Frage, wie würde ich alle meine Controller aus meinem Paket laden, ähnlich wie die loadViewsFrom() Methode funktioniert?

  • Während die Frage eigentlich ziemlich interessant ist, ist sie sehr weit gefasst. Zitieren des nahen Grundes: Entweder gibt es zu viele Antwortmöglichkeiten oder gute Antworten wären zu lang für dieses Format. Bitte fügen Sie Details hinzu, um die Antwortmenge einzugrenzen oder ein Problem zu isolieren, das in wenigen Absätzen beantwortet werden kann. (Ich habe nicht abgelehnt, aber für das Schließen gestimmt)

    – Lukasgeiter

    12. Februar 2015 um 19:22 Uhr

  • @lukasgeiter Ich habe weitere Einzelheiten hinzugefügt.

    – Imperium2335

    12. Februar 2015 um 19:27 Uhr

  • Herr Otwell betrachtet HMVC als ein Antimuster. Da Sie PSR-4 in Laravel 5 haben, können Sie Module mit Namespaces frei emulieren. Dann sollten Sie einen Modul-Controller an einen View-Composer binden. laravel.com/docs/5.0/views#view-composers

    – Benutzer2094178

    12. Februar 2015 um 19:37 Uhr

  • @user2094178 Haben Sie ein Beispiel für einen modularen Ansatz mit einer solchen Methode? Ich habe meine Nüsse gegoogelt und nichts gefunden, das eine benutzerdefinierte modulare App beschreibt 🙁

    – Imperium2335

    12. Februar 2015 um 19:47 Uhr

  • Während wir hier allgemeine Richtlinien haben, dass Fragen nicht zu weit gefasst oder diskursiv sein sollten, denke ich, dass dies eine ausreichende Grauzone ist, um der Schließung zu entgehen (IMO). Interessant/neuartig zu sein hilft, denke ich. Wenn Sie in Zukunft selbst eine Lösung finden, posten Sie sie bitte als Antwort.

    – Halber

    12. Februar 2015 um 20:13 Uhr

Ich scheine alles verstanden 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 so:

Geben Sie hier die Bildbeschreibung ein

Ich habe mein Core-Modul router.php zum Laufen gebracht, indem ich meine Controller für dieses Modul in eine Gruppe gepackt 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 Namensräume richtig zu machen.

Danke für all eure Hilfe und Geduld!

  • Vielen Dank für die Frage und all die Bemühungen, die Antwort herauszufinden. Das ist genau das, was ich brauche. Meiner Meinung nach funktioniert die Struktur von Laravel 5 perfekt für kleine bis mittlere Anwendungen. Wenn es jedoch um große Projekte mit verschiedenen Modulen und verschiedenen Entwicklern geht, ist die Modularisierung einer L5-App unerlässlich @imperium2335

    – DucCuong

    8. Mai 2015 um 6:39 Uhr

  • Route::group(array(‘namespace’ => ‘Modules\Admin’), function() { Route::get(‘/admin/dashboard’,’AdminController@index’); }); Dies gibt immer den Fehler „Class Modules\Admin\AdminController existiert nicht“ zurück. Ich habe die gleiche Ordnerstruktur und mein Problem ist bereits hier. stackoverflow.com/questions/33996528/routing-in-laravel-module/… Es wäre toll, wenn jemand eine Lösung finden könnte.

    – Ich bin Nidhin

    30. November 2015 um 13:13 Uhr


Benutzer-Avatar
Kundan roy

Lösung:

Schritt 1: Ordner „Module“ in „app/“ erstellen


Schritt 2: Erstellen Sie im Ordner Module Ihr Modul (Module1 (angenommen, Admin-Modul))

 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

Module2( suppose API )
-Controllers
-Views
-Models
-routes.php

Schritt 3: Erstellen Sie ModulesServiceProvider.php im Ordner „Modules/“.


Schritt 4: Fügen Sie den folgenden Code in ModulesServiceProvider.php ein

<?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 <[email protected]>
 * @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."https://stackoverflow.com/".$module.'/routes.php')) {

                include DIR."https://stackoverflow.com/".$module.'/routes.php';
            }

            if (is_dir(DIR."https://stackoverflow.com/".$module.'/Views')) {
                $this->loadViewsFrom(DIR."https://stackoverflow.com/".$module.'/Views',$module);
            }
        }
    }

    public function register() { }

}

Schritt 5: Fügen Sie die folgende Zeile in die Datei „config/app.php“ ein

App\Modules\ModulesServiceProvider::class,

Schritt 6: Erstellen Sie die Datei module.php im Ordner „config“.

Schritt 7: Fügen Sie den folgenden Code in module.php hinzu (Pfad => „config/module.php“)

<?php

return [
    'modules'=>[
        'admin',
        'web',
        'api'
    ]
];

Hinweis: Sie können Ihren Modulnamen hinzufügen, den Sie erstellt haben. Hier gibt es Module.

Schritt 8: Führen Sie diesen Befehl aus

composer dump-autoload

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 die app/Modules Ordner und sie sind einsatzbereit/funktionsbereit. Schau mal. Etwas Zeit sparen 😉

l5-modular

  • Wäre es möglich, die Module über eine zentrale GUI zu aktivieren oder zu deaktivieren? Oder ist Ihre Struktur dafür nicht geeignet?

    – Aschwin Wesselius

    18. Januar 2016 um 12:21 Uhr

  • Was meinst du mit “zentrale GUI”? Standardmäßig können Sie die Module in der entsprechenden deaktivieren app/config/modules.php Datei. Wenn Sie Ihre Module dynamisch verwalten müssen, würde ich empfehlen, mein Git zu forken und die ModuleServiceProvider.php (Zeile 19) so, wie Sie es brauchen (FA. Holen Sie sich Ihre Modulladeliste von DB).

    – Gordon Freeman

    18. Januar 2016 um 19:02 Uhr

  • Auch könntest du das einstellen modules.enable Konfiguration zur Laufzeit. FA. config(['modules.enable' => ['customer', 'contract', 'reporting']]);

    – Gordon Freeman

    20. Januar 2016 um 8:03 Uhr

  • @GordonFreeman: Ich habe deine Arbeit überprüft. In der Installation haben Sie gesagt, dass Sie eine Zeile in composer.json hinzufügen sollen. aber du hast nicht gesagt, unter was und wo genau diese Zeile in composer.json hinzugefügt werden soll?

    – saadk

    31. Mai 2016 um 12:36 Uhr

  • @saadk Sie müssen die Zeile in die hinzufügen require Knoten. genau wie jedes andere PHP-Paket, das Sie über Composer installiert haben. Werfen Sie einen Blick auf die Dokumente getcomposer.org/doc/04-schema.md#package-links

    – Gordon Freeman

    31. Mai 2016 um 13:19 Uhr

Sie können auch verwenden Pingpong-Labore

Dokumentationen Hier.

Hier ist ein Beispiel.

Sie können den Prozess einfach installieren und überprüfen.

Hinweis: Ich mache keine Werbung. Habe gerade überprüft, ob CMS auf Laravel mit Modulunterstützung aufgebaut ist. Dachte also, das könnte für Sie und andere hilfreich sein.

Benutzer-Avatar
gabrielkolbe

Kundan roy: Ich mochte Ihre Lösung, aber ich habe Ihren Code von StackOverflow kopiert, ich musste die Anführungszeichen und halben Anführungszeichen ändern, damit es funktioniert – ich denke, SOF ersetzt diese. Außerdem wurde Dir für base_path() so geändert, dass es besser mit dem (neuen) Format von Laravel übereinstimmt.

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 <[email protected]>
* @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() {}

}

Benutzer-Avatar
Sagar Naliyapara

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, geben Sie einfach Folgendes in Ihre composer.json Datei:

{
    "require": {
        "pingpong/modules": "~2.1"
    }
}

Und dann laufen composer install um das Paket zu holen.

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

für mehr besuch: https://github.com/pingpong-labs/modules

1345190cookie-checkWie strukturiere ich eine modulare App in Laravel 5?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy