Как структурировать модульное приложение в Laravel 5?

63

Я хотел бы разделить мое приложение в модулях. Например, были бы "основные" модули, содержащие основные функции входа, макет/форматирование приложения (CSS и т.д.), Управление пользователями и дневник.

Позже я могу создать другие модули, такие как менеджер контактов, который можно легко добавить или удалить из приложения.

В навигации приложений будет некоторая логика для определения того, какие модули присутствуют, и показать/скрыть ссылки на них.

Как я могу это сделать с точки зрения структуры каталогов, пространств имен и всего, что нужно?


Я смотрю на creolab/laravel-modules, но он утверждает, что это для Laravel 4. Могу ли я использовать его с 5 точно так же?

В документации говорится о размещении моделей, контроллеров и представлений в каждом каталоге модулей, но как это работает с маршрутами? В идеале я хотел бы, чтобы каждый модуль имел свой собственный файл routes.php. Как все это будет работать с материалами в каталоге http и resources?


Я думал о чем-то вроде этого:

Изображение 246

Но я понятия не имею, как я могу заставить его работать.


Я только что попробовал учебник здесь:

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()?

  • 1
    Хотя вопрос на самом деле довольно интересный, он очень широкий. Приводим близкую причину: либо слишком много возможных ответов, либо хорошие ответы будут слишком длинными для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или выделить проблему, на которую можно ответить в нескольких параграфах. (Я не отрицал, но проголосовал за закрытие)
  • 1
    @lukasgeiter Я добавил больше подробностей.
Показать ещё 5 комментариев
Теги:
laravel-5
laravel-routing

6 ответов

30

Кажется, я все понял.

Я отправлю его здесь, если он поможет другим новичкам, он просто хотел получить правильные пространства имен.

В моем composer.json у меня есть:

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

Мой каталог и файлы закончились следующим образом:

Изображение 3564

Я получил свой модуль Core router.php для работы, завернув мои контроллеры для этого модуля в группу, определяющую пространство имен:

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

Я предполагаю, что когда я приду к своим моделям для пакета, это будет аналогичный случай получения правильных пространств имен.

Спасибо за вашу помощь и терпение!

  • 1
    Спасибо за вопрос и все усилия, чтобы выяснить ответ. Это именно то, что мне нужно. На мой взгляд, структура Laravel 5 прекрасно работает для малых и средних приложений. Тем не менее, когда речь идет о крупных проектах с разными модулями и разными разработчиками, Modularize для L5-приложения крайне важен @ imperium2335
  • 1
    Route :: group (array ('namespace' => 'Modules \ Admin'), function () {Route :: get ('/ admin / dashboard', 'AdminController @ index');}); Это всегда возвращает ошибку «Модули классов \ Admin \ AdminController не существует». У меня такая же структура папок, и моя проблема уже здесь. stackoverflow.com/questions/33996528/routing-in-laravel-module/… Было бы здорово, если бы кто-то смог найти решение.
7

Решение:

Шаг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
 * 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() { }

}

Шаг 5: добавьте следующую строку внутри файла config/app.php

App\Modules\ModulesServiceProvider::class,

Шаг6: Создайте файл module.php внутри 'config folder

Шаг7: добавьте следующий код внутри module.php(path = >   "Конфигурации/module.php" )

<?php

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

Примечание. Вы можете добавить свое имя модуля в зависимости от того, что вы создали. Здесь есть модули.

Шаг 8. Запустите эту команду

composer dump-autoload
6

Немного поздно, но если вы хотите использовать модули в своих будущих проектах, я написал генератор модулей. Он генерирует модули через php artisan make:module name. Вы также можете просто отбросить некоторые модули в папке app/Modules, и они готовы к использованию/работе. Взглянуть. Сэкономьте некоторое время;)

l5-modular

  • 1
    Можно ли включить или отключить модули с помощью центрального графического интерфейса? Или ваша структура не подходит для этого?
  • 2
    что вы подразумеваете под "центральным графическим интерфейсом"? по умолчанию вы можете отключить модули в соответствующем файле app/config/modules.php . Если вам нужно динамически управлять вашими модулями, я бы порекомендовал ModuleServiceProvider.php мой git и адаптировать ModuleServiceProvider.php (строка 19) так, как вам это нужно (FA. Получить список загрузки ваших модулей из БД).
Показать ещё 3 комментария
2

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
* 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

Вы также можете использовать pingpong-labs

документация Здесь.

Вот пример.

Вы можете просто установить и проверить процесс.

Примечание. Я не рекламирую. Просто проверил, что cms построен на Laravel с поддержкой модуля. Поэтому подумал, что может быть полезно для вас и других.

0

pingpong/modules - это пакет laravel, созданный для управления вашим большим приложением laravel с использованием модулей. Модуль похож на пакет 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню