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:
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()
?
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:
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!
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
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;)
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() {}
}
Vous pouvez également utiliser pingpong-labs
documentations ici .
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.
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