如何在Laravel 5中构建模块化应用程序?

2022-08-30 08:36:40

我想将我的应用程序划分为模块。例如,将有一个“核心”模块,其中包含基本的登录功能,应用程序布局/格式(CSS等),用户管理和日记。

稍后,我可能会创建其他模块,例如联系人管理器,这些模块可以轻松在应用程序中添加或删除。

应用程序导航中有一些逻辑,用于确定存在哪些模块并显示/隐藏指向它们的链接。

如何在目录结构,命名空间和所需的任何其他方面执行此操作?


我正在研究creolab / laravel模块,但它指出它是针对Laravel 4的。我还能以完全相同的方式与5一起使用吗?

文档说要在每个模块目录中放置模型,控制器和视图,但这如何与路由一起使用?理想情况下,我希望每个模块都有自己的路由.php文件。所有这些将如何与 目录中的内容一起使用?httpresources


我在想这样的事情:

Module idea

但我不知道如何让它工作。


我刚刚在这里尝试了教程:

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

我似乎已经想通了一切。

我会把它贴在这里,以防它帮助其他初学者,它只是为了获得正确的命名空间。

在我的 composer.json 中,我有:

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

我的目录和文件最终是这样的:

enter image description here

我让我的核心模块路由器.php通过将该模块的控制器包装在一个指定命名空间的组中来工作:

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

我想当我为包做我的模型时,这将是一个类似的情况,即获得正确的命名空间。

感谢您的帮助和耐心!


答案 2

溶液:

Step1:在“app/”中创建文件夹“模块”


Step2:在模块文件夹中创建您的模块(模块1(假设是管理模块))

 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

Step3 :在“模块/”文件夹中创建模块服务提供程序.php


Step4 :将以下代码粘贴到模块服务提供程序中.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 <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步:在“配置/应用程序”文件中添加以下行.php

App\Modules\ModulesServiceProvider::class,

第6步:在“config”文件夹中创建模块.php文件

Step7 :在模块中添加以下代码.php(路径=>“config/module.php”)

<?php

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

注意:您可以添加已创建的模块名称。这里有模块。

步骤8:运行此命令

composer dump-autoload

推荐