【问题标题】:How can I create a module/extension base system in Laravel 5.2?如何在 Laravel 5.2 中创建模块/扩展基础系统?
【发布时间】:2016-01-05 01:05:26
【问题描述】:

我使用Laravel 5.2 编写了一个系统,该系统具有多个模块/包功能。所有模块都将位于名为modules 的文件夹中。

首先,我编写了一个小包,它位于名为modules/Mikea/Surveys 的文件夹中。文件夹Mikea 是供应商名称,Surveys 是模块/包名称。每个包都必须有它自己的composer.json 文件,它允许开发人员使用它自己的作曲家配置来配置每个包。

这里的想法是安装一个支持扩展的 Laravel 安装,以允许任何开发人员为我的主要“系统”做出贡献。

这是我的modules 文件夹的样子

modules
modules/Mikea
modules/Mikea/Surveys
modules/Mikea/Surveys/database
modules/Mikea/Surveys/resources
modules/Mikea/Surveys/composer.json
modules/Mikea/Surveys/routes.php

modules/Mikea/Surveys/src
modules/Mikea/Surveys/src/Controllers
modules/Mikea/Surveys/src/Jobs
modules/Mikea/Surveys/src/Models
modules/Mikea/Surveys/src/....

在我的主要 composer.json 文件中,我在存储库部分使用“路径”类型,就像您在以下 composer.json 文件中看到的那样

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.2.*",
        "laravelcollective/html": "5.2.x-dev",
        "mikea/surveys": "*"
    },
    "require-dev": {
        "fzaninotto/faker": "~1.4",
        "mockery/mockery": "0.9.*",
        "phpunit/phpunit": "~4.0",
        "phpspec/phpspec": "~2.1",
        "symfony/dom-crawler": "~3.0",
        "symfony/css-selector": " ~3.0"
    },
    "repositories": [
        {
            "type": "path",
            "url": "modules/mikea/Surveys"
        }
    ],
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
    "autoload-dev": {
        "classmap": [
            "tests/TestCase.php"
        ]
    },
    "scripts": {
        "post-install-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "pre-update-cmd": [
            "php artisan clear-compiled"
        ],
        "post-update-cmd": [
            "php artisan optimize"
        ],
        "post-root-package-install": [
            "php -r \"copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ]
    },
    "config": {
        "preferred-install": "dist"
    }
}

modules/Mikea/Surveys 我有另一个composer.json 文件,它允许我单独配置每个包,如包版本、许可证、作者......

这是我的第二个 composer.json 文件“composer.json for my extension”的副本

{
    "name": "mikea/surveys",
    "type": "library",
    "version": "0.1.4",
    "description": "Survey System",
    "keywords": ["Mike A", "Surveys"],
    "license": "MIT",
    "authors": [
        {
            "name": "Mike A",
            "email": "mikea@example.com"
        }
    ],

    "require": {
        "php": ">=5.4.0"
    },
    "autoload": {
        "classmap": [
            "database/migrations",
            "database/seeds"
        ],
        "psr-4": {
            "mikea\\Surveys\\": "src/"
        }
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}

现在一切正常。我所要做的就是从命令行执行composer update。它只会将文件从\modules\Mikea\Surveys复制到\vendor\mikea\Surveys

然后我可以使用命令行发布我的视图。

我面临的问题是,每次我对modules/Mikea/Surveys 中的文件进行更改时,我都必须执行以下两个丑陋的步骤才能在浏览器中查看我的工作。

  1. 在我的第二个 composer.json 文件中,我必须增加模块版本号的值“基本上欺骗作曲家认为有新版本的包”
  2. 运行composer update 将文件从\modules\Mikea\Surveys 重新复制到\vendor\mikea\Surveys

这显然是太多的工作,没有人愿意这样做!

当我处于开发模式时,如何告诉作曲家从modules/Mikea/Surveys 自动加载文件?因此,继续更改/更新我将继续从\modules\Mikea\Surveys 文件夹工作,直到我准备好发布我的软件包的新版本。准备好后,我将创建一个新版本并运行 composer update 以获取最新的可用版本。

我对如何开发这样一个系统的更好想法持开放态度。

【问题讨论】:

    标签: php laravel composer-php laravel-5.2


    【解决方案1】:

    您需要在 composer.json 主文件中为 pst-4 对象中的所有模块添加命名空间,就像您为 mikea\surveys 所做的一样。

    【讨论】:

      【解决方案2】:

      在 bootstrap/autoload.php 中将 require 绑定到一个变量,如下所示:

      $autoload = require __DIR__.'/../vendor/autoload.php';
      

      然后:

      $autoload->addPsr4($namespace, $path);
      

      这将使用 composer 自动加载器注册您的命名空间,而不向您的 composer.json 添加任何内容。您还可以在 composer.json 旁边创建第二个 json,它将自动加载命名空间,并在您的 laravel 应用程序中创建一个服务提供者,该服务提供者将自动加载已启用包的服务提供者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-15
        • 1970-01-01
        • 2021-03-19
        • 2020-02-12
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        相关资源
        最近更新 更多