Laravel 5+ 中模块化编程的最佳实践

Best practice to modular programming in Laravel 5+

我正在开始一个新项目,我想重用其中的某些部分,主要是与用户注册和身份验证相关的内容。我可以复制并粘贴所有代码,但我想再次使用。我知道 Laravel 中有 Package Development 但这并不容易,感觉必须有更好的方法。 几天前我发现了一个 pingpong/modules 但我不知道它。这是第三方插件,不要相信它。

使用这个插件是真的吗?这个插件后来更新了吗? Embedd Package Laravelpingpong/modules 有什么区别?或者你有什么建议吗?

要重用您的 classes 只需使用 php namespacesuse 回调您的类。

使用命名空间

namespace Acme\Tools;
class Foo
{
 echo "me";
}

你可以打电话classfoo

<?php 

$foo = new \Acme\Tools\Foo();

正在使用.

你也可以使用use语句如下:

<?php
use \Acme\Tools\Foo;
$foo = new Foo();

使用中间件 您还应该使用中间件来过滤谁应该使用脚本,即 Auth 中间件,这将帮助您过滤用户、注册、登录阅读更多 http://laravel.com/docs/5.1/middleware

使用Eloquent 使用 ORM 为您的模型创建 REST api,非常简单,始终让您的控制器 class 扩展 eloquent 使用 Illuminate\Database\Eloquent\Model; 即:

use Illuminate\Database\Eloquent\Model; .阅读更多 http://laravel.com/docs/5.1/eloquent

最后在内置的辅助函数中使用Laravel 有许多 Laravel 内置的 Helper 函数,使用时只需阅读文档即可帮助您

我用过乒乓模块。这是一个非常酷的包。我不确定它是否更新了很多。但这是一个非常简单的包。它唯一做的就是创建一个文件夹,其结构与应用程序文件夹 + 视图中的结构几乎相同。但这些是模块。如果您对它们进行正确编程,则可以重复使用它。吉米的另一个答案也是如此,如果你有一个好的结构,你可以重用任何东西。

编辑

在下图中,您将看到 pingpong 模块的示例。就像你一样,它与应用程序文件夹的结构几乎相同。也许更多的根文件夹。通常它运行 start.php 并且你在 Http 文件夹中有一个 routes.php 文件。我定制了我的一点。并在 RouteServiceProvider 中加载前端和后端路由。这是用 laravel 5.1.

构建的

Pingpong modules 似乎是为 Laravel 5 的早期版本构建的,以及它们与未来版本(可能是当前的 5.1.11)兼容的程度我不能说。

没有多少 activity 查看 2.1 的提交历史,截至今天(12 月 18 日),最后一次提交是在 6 个月前。

但是这个包是专门为Laravel设计的吗?好像是。它们提供了一系列对开发有用的特性。唯一不幸的是你在自己的 git 环境中得到了很多代码(这是好事吗?我不知道,你喜欢什么)。

就我个人而言,我不喜欢以这种方式进行开发,我更喜欢将它们放在 vendor/ 文件夹中,否则更新到较新的版本会很痛苦。

因为 Laravel 5 Taylor 希望不再像 Laravel 4 中那样使包开发过于具体。要使用 Laravel 制作您的包,您唯一可以(但不必)做的就是使用 ServiceProviderServiceProvider 是 bootstrap 进入 Laravel 应用程序。

如果您想扩展或实现自己的功能,请分叉存储库并自己在其之上构建并托管它(通过 github/packagist 或使用 Satis 的私人存储库)。

Pingpong 模块 (2.1) 是为 Laravel 5 构建的,您描述的它们(嵌入式 Laravel 包)更适合 Laravel 4,因为您必须以更具体的方式编写包。

但是,还有别的选择吗?

每当您想要更活跃的 project/package 进行开发时,您应该试用 Asgard CMS。它们非常模块化,我想我在某处读到它的灵感来自于这个包(完全不确定)。

构建自己怎么样?

当然,您可以构建自己的包来获得相同的结果。并根据需要将其创建为模块化。我为我的公司创建了很多 modules,我们可以创建非常简单的整个系统并使用和 extending/overriding 模块。即使是模块中的小部分也可以根据项目的特定需求进行覆盖。

我们选择了与 Laravel 项目的 app/ 文件夹几乎相同的结构,以防 CMS/API 模块。

一个包看起来像:

tests/
src/
    Acme/
        Controllers/
        Requests/
    Models/
        Module.php // contains some specifc calculations for example
    ModelServiceProvider.php
composer.json

composer.json 文件中我们自动加载:"Module\": "src/"config/app.php 中我们注册了 ModuleServiceProvider。现在我们将功能注入 Laravel 的容器中,我们可以通过 app() 实例使用它吗?

但是每当我们只想在另一个项目或独立项目中使用 Models 时,我们仍然可以使用它,因为 composer 的自动加载功能和我们构建包的方式。可能使用:

<?php 

    require_once __DIR__ .'/vendor/autoload.php';

    use Module\Models\Module;

    $module = new Module;

编辑

我们喜欢使用的包结构,有一个部分用于 API 或 CMS 内容:

tests/
src/
    Cms/
        Controllers/
        Requests/
    Api/
        Controllers/
        Transformers/
    Models/
        Module.php // contains some specifc calculations for example
    Providers/
        CmsServiceProvider.php // includes `ModuleServiceProvider`
        ApiServiceProvider.php // includes `ModuleServiceProvider`
    ModuleServiceProvider.php // contains global stuff like commands etc.
composer.json

而不是在 config/app.php 中注册 ModuleServiceProvider 我们根据 client/project.[=32= 的意愿注册 ApiServiceProviderCmsServiceProvider ]