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

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

稍后,我可能会创建其他模块,比如联系人管理器,这些模块可以很容易地从应用程序中添加或删除。

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

我如何在目录结构、名称空间和其他需要的方面做到这一点?


我正在查看 creolab/Laravel 模块,但它指出,这是为 Laravel 4。我仍然可以用完全相同的方式使用它与5?

文档说要在每个模块目录中放置模型、控制器和视图,但是如何处理路由呢?理想情况下,我希望每个模块都有自己的 outoutes.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()方法是如何工作的一样?

42046 次浏览

我好像都想明白了。

我将在这里发布它,以防它帮助其他初学者,它只是关于获得正确的名称空间。

在我的作曲家 json 里,我有:

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

我的目录和文件结果如下:

enter image description here

我将核心模块 router.php 的控制器封装在一个指定名称空间的组中,从而使其正常工作:

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

我想当我开始为这个包建立模型时,也会遇到类似的命名空间问题。

谢谢你的帮助和耐心!

有点晚了,但是如果您想在未来的项目中使用模块,我已经编写了一个模块生成器。它通过 php artisan make:module name生成模块,你也可以将一些模块放到 app/Modules文件夹中,它们就可以使用/工作了。 看一下,节省一些时间;)

15模块

也可以使用 乒乓球室

文件。

这里有一个例子。

您可以直接安装并检查过程。

注意: 我不是在做广告。刚检查了在 Laravel 上构建的带模块支持的 CMS。所以觉得这对你和其他人都有帮助。

解决方案:

步骤1: 在“ app/”中创建文件夹“ Module”


步骤2: 在模块文件夹中创建模块(模块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

步骤3: 在“ Module/”文件夹中创建 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 <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: 在‘ config’文件夹中创建 module.php 文件

步骤7: 在 module.php (path = >)中添加以下代码 “ config/module.php”)

<?php


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

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

Step8: 运行这个命令

composer dump-autoload

昆丹罗伊: 我喜欢你的解决方案,但我复制了你的代码从 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 <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 软件包,用于使用模块管理大型 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