1

我想使用一些大部分满足我需求的 3rd 方模块,但是要将它们用于我的特定应用程序,我必须进行一些更改。更具体地说,我正在使用提供 ACL 功能的模块,而该模块又依赖于提供用户和角色的模块。模块本身已经内置了数据库结构,定义了用户对象,定义了角色对象,定义了它们之间的关系等等。这些模块还有一个验证码、一些带有特定布局的 HTML 文件,以及其他一些东西。

我需要使用 ACL,但不是所有其他的东西。所以我需要定制模块中的东西以满足我的需要,即:

  • 重构数据库模式 - 添加字段,将表之间的关系从一对多更改为多对多,添加更多表,删除其他表等
  • 更新 HTML 以添加 HTML 代码、jQuery 代码等。
  • 更新验证码以使用另一个类
  • 将来可能会改变代码本身生成 ACL 对象的方式

我的印象是正确的 ZF2 方法是扩展模块以修改它以满足我的需要。我看不到轻松扩展这些模块以进行更改的方法,但也许有一种方法。我担心如果我扩展它,我的扩展将尝试撤消或重做许多基本模块已经拥有的东西。换句话说,它会变得凌乱。我不妨创建自己的 ACL 模块。

另一种选择是直接编辑模块。我不想在vendor文件夹中编辑模块的代码,因为这样做是不可取的,但我基本上想按原样获取模块并开始破解它们。

问题: 我如何使用 3rd 方模块 ZF2 方式,同时允许我对它们进行广泛的自定义?

现在我正在考虑按原样获取模块,将它们的内容复制到我的 ZF2 的module文件夹中,并将它们用作我自己的 ZF2 应用程序的内部模块。然后将它们检入与我的主应用程序代码相同的版本控制中。

我看到的唯一可能的缺点是,如果模块由原作者更新并且我想要他们的更新,我将需要手动复制它们并合并它们,或者使用 git 补丁之类的东西,或者git cherry-pick.

4

1 回答 1

2

编辑位于供应商文件夹下的任何代码或通过复制和粘贴将它们合并到您的真棒应用程序的模块/库/任何文件夹中都不是一个好习惯。

我认为作曲家是你正在寻找的。您可以像老板一样轻松地使用任何 3rd 方库,并且当该库不能满足您的要求时,扩展需要在您自己的代码库中巧妙地使用命名空间提供更多功能的类。

例如,如果 Zend 的可用分页适配器都不足以满足您的要求,请使用名称空间和现有接口,使用类似的脚手架扩展/重用/实现它们。例子:

<?php
namespace YourModule\Paginator\Adapter;

use Zend\Paginator\Adapter\AdapterInterface;

class MyAwesomePaginatorAdapter implements AdapterInterface
{
   ...
}

在典型的 ZF2 应用程序中,您可以对 composer 管理的每个库执行完全相同的操作。packagist 上有很多非常好的库。

我认为另一种好方法是分叉一个现有的 3rd 方库,该库托管在 github 等流行服务中。将该库分叉到您的帐户,通过提供您自己的分叉源(非原创)在项目的 composer.json 中要求。

另一方面,在您的工作环境中为您的分叉 3rd 方库克隆创建另一个项目。在您自己的帐户下克隆、编辑、改进和管理该库,与您的项目和原始源分开。

当您认为您所做的改进真的很不错时,请通过为其他人打开拉取请求来回馈原始库。

于 2013-11-14T21:43:04.127 回答