Laravel 5+ 中模块化编程的最佳实践
Best practice to modular programming in Laravel 5+
我正在开始一个新项目,我想重用其中的某些部分,主要是与用户注册和身份验证相关的内容。我可以复制并粘贴所有代码,但我想再次使用。我知道 Laravel 中有 Package Development
但这并不容易,感觉必须有更好的方法。
几天前我发现了一个 pingpong/modules
但我不知道它。这是第三方插件,不要相信它。
使用这个插件是真的吗?这个插件后来更新了吗? Embedd Package Laravel
和 pingpong/modules
有什么区别?或者你有什么建议吗?
要重用您的 classes 只需使用 php namespaces
或 use
回调您的类。
使用命名空间
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
制作您的包,您唯一可以(但不必)做的就是使用 ServiceProvider
。 ServiceProvider
是 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= 的意愿注册 ApiServiceProvider
或 CmsServiceProvider
]
我正在开始一个新项目,我想重用其中的某些部分,主要是与用户注册和身份验证相关的内容。我可以复制并粘贴所有代码,但我想再次使用。我知道 Laravel 中有 Package Development
但这并不容易,感觉必须有更好的方法。
几天前我发现了一个 pingpong/modules
但我不知道它。这是第三方插件,不要相信它。
使用这个插件是真的吗?这个插件后来更新了吗? Embedd Package Laravel
和 pingpong/modules
有什么区别?或者你有什么建议吗?
要重用您的 classes 只需使用 php namespaces
或 use
回调您的类。
使用命名空间
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
制作您的包,您唯一可以(但不必)做的就是使用 ServiceProvider
。 ServiceProvider
是 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= 的意愿注册 ApiServiceProvider
或 CmsServiceProvider
]