Я хотел бы разделить мое приложение на модули. Например, были бы «основные» модули, содержащие основные функции входа, макет / форматирование приложения (CSS и т. Д.), Управление пользователями и дневник.
Позже я могу создать другие модули, такие как менеджер контактов, который можно легко добавить или удалить из приложения.
В навигации по приложениям будет определенная логика для определения того, какие модули присутствуют, и показать / скрыть ссылки на них.
Как я могу это сделать с точки зрения структуры каталогов, пространств имен и всего остального, что необходимо?
Я смотрю на creolab / laravel-modules, но он утверждает, что это для Laravel 4. Могу ли я использовать его с 5 точно так же?
В документации говорится разместить модели, контроллеры и представления в каждом каталоге модулей, но как это работает с маршрутами? В идеале я хотел бы, чтобы каждый модуль имел свой собственный файл routes.php. Как все это будет работать с материалом в каталоге http
и resources
?
Я думал о чем-то подобном:
Но я понятия не имею, как мне заставить его работать.
Я только что попробовал учебник здесь:
http://creolab.hr/2013/05/modules-in-laravel-4/
Без дополнительных библиотек и т. Д., Просто чистый Laravel 5.
Кажется, я столкнулся с кирпичной стеной с сообщением об ошибке:
FatalErrorException in ServiceProvider.php line 16: Call to undefined method Illuminate\Config\Repository::package()
Относительно следующего:
<?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; } }
Что вызывает это и как я могу это исправить?
Поймал голову вокруг этого немного больше. Получил мои пути к пакетам / модулям и представлениям, которые великолепны:
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; } }
У меня есть последний вопрос: как мне загрузить все мои контроллеры из моего пакета, как работает метод loadViewsFrom()
?
Кажется, я все это понял.
Я отправлю его здесь, если он поможет другим новичкам, он просто хотел получить правильные пространства имен.
В моем композиторе.json у меня есть:
... "autoload": { "classmap": [ "database", "app/Modules" ], "psr-4": { "App\\": "app/", "Modules\\": "Modules/" } }
Мой каталог и файлы оказались такими:
Я получил свой модуль Core router.php для работы, завернув мои контроллеры для этого модуля в группу, определяющую пространство имен:
Route::group(array('namespace' => 'Modules\Core'), function() { Route::get('/test', ['uses' => 'TestController@index']); });
Я предполагаю, что когда я приду к своим моделям для пакета, это будет аналогичный случай получения правильных пространств имен.
Спасибо за вашу помощь и терпение!
Решение:
Шаг 1: Создайте папку «Модули» внутри «app /»
Шаг 2. В папке «Модули» создайте свой модуль (Module1 (предположим, модуль администратора)).
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)
Аналогичным образом, вы можете создавать несколько модулей
Module2( suppose API ) -Controllers -Views -Models -routes.php
Шаг 3: Создайте ModulesServiceProvider.php внутри папки «Модули /»
Шаг4: Вставьте следующий код внутри 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 * ie 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() { } }
Шаг 5. Добавьте следующую строку внутри файла config / app.php.
App\Modules\ModulesServiceProvider::class,
Шаг 6: Создайте файл module.php внутри папки 'config'
Шаг7: Добавьте следующий код внутри module.php (path => "config / module.php")
<?php return [ 'modules'=>[ 'admin', 'web', 'api' ] ];
Примечание. Вы можете добавить имя своего модуля, которое вы создали. Здесь есть модули.
Шаг 8. Запустите эту команду.
composer dump-autoload
Немного поздно, но если вы хотите использовать модули в своих будущих проектах, я написал генератор модулей. Он генерирует модули через php artisan make:module name
Вы также можете просто удалить некоторые модули в папке app/Modules
и они готовы к использованию / работе. Взглянуть. Сэкономьте некоторое время;)
l5-модульные
Вы также можете использовать pingpong-labs
Документация здесь .
Вот пример.
Вы можете просто установить и проверить процесс.
Примечание. Я не рекламирую. Просто проверил, что cms построен на Laravel с поддержкой модуля. Поэтому подумал, что это может быть полезно для вас и других.
Kundan roy: Мне понравилось ваше решение, но я скопировал ваш код из StackOverflow, мне пришлось изменить кавычки и полуквоты, чтобы заставить его работать – я думаю, что SOF заменит их. Также был изменен Dir для base_path (), чтобы быть более встроенным в формат 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 * ie 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() {} }
pingpong/modules
– это пакет laravel, созданный для управления вашим большим приложением larvel с использованием модулей. Модуль похож на пакет laravel для легкой структуры, имеет некоторые виды, контроллеры или модели.
Он работает как в Laravel 4, так и в Laravel 5.
Для установки через композитор просто добавьте в файл composer.json
:
{ "require": { "pingpong/modules": "~2.1" } }
А затем запустите composer install
чтобы получить пакет.
Чтобы создать новый модуль, вы можете просто запустить:
php artisan module:make <module-name>
– Необходимые. Будет создано имя модуля. Создать новый модуль
php artisan module:make Blog
Создание нескольких модулей
php artisan module:make Blog User Auth
для более подробной информации: https://github.com/pingpong-labs/modules