如何扩展 Zend\Db\Sql\Select?

Posted

技术标签:

【中文标题】如何扩展 Zend\\Db\\Sql\\Select?【英文标题】:How to extend Zend\Db\Sql\Select?如何扩展 Zend\Db\Sql\Select? 【发布时间】:2017-10-02 13:41:55 【问题描述】:

我正在使用 MSSQL 并希望实现 WITH 函数(根据 Using ZF2, create a WITH statement?)。为此,我扩展了\Zend\Db\Sql\Select 类,添加了添加WITH 函数所需的属性和方法。我现在如何告诉我的应用程序使用这个 Select 类而不是 Zend 类?

一种方法是在我的 composer.json 文件中指定一个autoload

"autoload": 
        "psr-4": 
            "Zend\\Db\\Sql\\": "vendor/rpk/Rpk/Zend/Db/Sql"
        

在查看 zend 文件夹之前,它将在我的供应商文件夹中查找任何 Sql 命名空间的东西,但这需要我将整个 zend 选择类复制到我的选择类中——这是不受欢迎的,因为我的类不会t 从 zend 分支的未来补丁中受益。

【问题讨论】:

为什么还要强制它加载到那个命名空间?手动实例化你自己的类来使用它.. 我在我的模型中使用 TableGateways。这些实例化Zend\Db\Sql\Sql,然后实例化Zend\Db\Sql\Select。为了使用我的选择类,我必须创建一个新的表网关类和一个新的 sql 类,替换所有 SqlSelect 的实例。我希望有一个更优雅的解决方案 - 可能是模块引导类或全局配置文件中的几行? 【参考方案1】:

尝试在您的引导脚本中使用 class_alias() 指令将您的 Select 替换类(带有命名空间)别名为 ZF2 的 Select 类的完整命名空间 -

class_alias("Your\\Namespace\\Select", "Zend\\Db\\Sql\\Select");

不幸的是,这只是您上面给出的自动加载定义的一个更有针对性的版本,不幸的是,您仍然需要重新实现您的 Select 类版本,以将所有当前代码包含在 Zend Select 类中,如据我所知,没有从另一个类扩展一个类然后将扩展类别名为原始类的功能。

如果您使用BetterReflection 之类的东西来动态加载和提取“Zend”选择类的代码,您可以在代码中重命名该类,(可能将其缓存在某处,因此这个公认的昂贵操作不需要不断执行)并从中扩展您的选择类。为您的原始类名命名该扩展名将不是问题。

免责声明:我知道一些 Roave 作品,尤其是那些在 BetterReflection 上列为作者的作品。他们是体面的、乐于助人的人,虽然有些粗鲁。

【讨论】:

以上是关于如何扩展 Zend\Db\Sql\Select?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 如何将小部件扩展为具有更多内容的更大小部件?

websocket 扩展位

将内容扩展为空div

如何进行高效的源码阅读:以Spring Cache扩展为例带你搞清楚

在Fortran中,在扩展定义中,如何将公共过程设置为私有?

K8s自动扩缩容工具KEDA发布2.0版本,全面升级应用扩展能力