web-dev-qa-db-fra.com

Comment structurer une application modulaire en Laravel 5?

Je voudrais diviser mon application en modules. Par exemple, il y aurait un "noyau" de modules contenant la fonctionnalité de connexion de base, la présentation/mise en forme d'applications (CSS, etc.), la gestion des utilisateurs et un journal.

Plus tard, je pourrai créer d'autres modules, comme un gestionnaire de contacts, pouvant être facilement ajoutés ou supprimés de l'application.

Il y aurait une certaine logique dans la navigation des applications pour déterminer quels modules sont présents et pour afficher/masquer les liens vers ceux-ci.

Comment puis-je faire cela en termes de structure de répertoire, d'espaces de noms et de tout autre élément nécessaire?


Je regarde les modules creolab/laravel mais il est indiqué que c'est pour Laravel 4. Puis-je toujours l'utiliser avec 5 exactement de la même manière?

La documentation indique de placer des modèles, des contrôleurs et des vues dans chaque répertoire de module, mais comment cela fonctionne-t-il avec les itinéraires? Idéalement, j'aimerais que chaque module ait son propre fichier routes.php. Comment tout cela fonctionnera-t-il avec les éléments du répertoire http et du répertoire resources?


Je pensais à quelque chose comme ça:

Module idea

Mais je ne sais pas comment je pourrais le faire fonctionner.


Je viens d'essayer le tutoriel ici:

http://creolab.hr/2013/05/modules-in-laravel-4/

Sans bibliothèques supplémentaires, etc., pure Laravel 5.

Je semble avoir frappé un mur de briques avec un message d'erreur:

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

En ce qui concerne:

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

}

Qu'est-ce qui cause cela et comment puis-je le réparer?


J'ai un peu plus mal à la tête maintenant. Vous avez mes itinéraires de paquets/modules et mes vues qui fonctionnent, ce qui est excellent:

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

}

J'ai une dernière question: comment charger tous mes contrôleurs à l'intérieur de mon paquet, un peu comme la méthode loadViewsFrom()?

66
imperium2335

Il me semble avoir tout compris.

Je la posterai ici au cas où cela aiderait d'autres débutants, il s'agissait simplement de mettre les espaces de noms à jour.

Dans mon composer.json j'ai:

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

Mon répertoire et mes fichiers se sont terminés comme ceci:

enter image description here

J'ai obtenu que mon module central router.php fonctionne en encapsulant mes contrôleurs pour ce module dans un groupe spécifiant l'espace de nom:

Route::group(array('namespace' => 'Modules\Core'), function() {
    Route::get('/test', ['uses' => 'TestController@index']);
});

J'imagine que lorsque je créerai mes modèles pour le package, il en sera de même pour la création d'espace de noms.

Merci pour votre aide et votre patience!

34
imperium2335

Solution:

Étape 1: Créer un dossier "Modules" dans "app /"


Étape 2: Dans le dossier Modules, créez votre module (Module1 (suppose le module admin))

 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)

De même, vous pouvez créer plusieurs modules

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

Étape 3: Créer ModulesServiceProvider.php dans le dossier "Modules /"


Étape 4: Collez le code suivant dans ModulesServiceProvider.php

<?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.'/'.$module.'/routes.php')) {

                include DIR.'/'.$module.'/routes.php';
            }

            if (is_dir(DIR.'/'.$module.'/Views')) {
                $this->loadViewsFrom(DIR.'/'.$module.'/Views',$module);
            }
        }
    }

    public function register() { }

}

Étape 5: Ajouter la ligne suivante dans le fichier ‘config/app.php’

App\Modules\ModulesServiceProvider::class,

Step6: Créer un fichier module.php dans le dossier ‘config’

Étape 7: Ajoutez le code suivant dans module.php (chemin => “config/module.php”)

<?php

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

Remarque: vous pouvez ajouter le nom de votre module, quel que soit ce que vous avez créé. Ici, il y a des modules.

Step8: Exécuter cette commande

composer dump-autoload
9
Kundan roy

Un peu tard, mais si vous voulez utiliser des modules dans vos projets futurs, j'ai écrit un générateur de modules. Il génère des modules via php artisan make:module name Vous pouvez aussi simplement déposer des modules dans le app/Modules dossier et ils sont prêts à utiliser/work. Regarde. Gagnez du temps;)

l5-modulaire

6
Gordon Freeman

Kundan roy: J'ai bien aimé votre solution, mais j'ai copié votre code à partir de StackOverflow. J'ai dû modifier les guillemets et les demi-guillemets pour que tout fonctionne correctement. Je pense que SOF les remplace. Également changé Dir pour base_path () pour être plus en ligne avec le nouveau format de Laravel.

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() {}

}
2
gabrielkolbe

Vous pouvez également utiliser pingpong-labs

documentations ici .

Voici un exemple.

Vous pouvez simplement installer et vérifier le processus.

Note: je ne fais pas de publicité. Je viens de vérifier que cms est construit sur Laravel avec le support du module. Alors pensé que cela pourrait être utile pour vous et les autres.

2
Jnanaranjan

pingpong/modules est un package laravel qui a été créé pour gérer votre grand laravel à l'aide de modules. Le module est semblable à un package laravel pour une structure facile, il possède des vues, des contrôleurs ou des modèles.

Cela fonctionne à la fois Laravel 4 et Laravel 5.

Pour installer par le biais de composer, il vous suffit de saisir les informations suivantes dans votre composer.json fichier:

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

Et puis courez composer install pour récupérer le paquet.

Pour créer un nouveau module, vous pouvez simplement lancer:

php artisan module:make <module-name>

- Champs obligatoires. Le nom du module sera créé. Créer un nouveau module

php artisan module:make Blog

Créez plusieurs modules

php artisan module:make Blog User Auth

pour plus de visite: https://github.com/pingpong-labs/modules

0
Sagar Naliyapara