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

How to extend Zend\Db\Sql\Select?

提问人:Richard Parnaby-King 提问时间:5/4/2017 最后编辑:CommunityRichard Parnaby-King 更新时间:5/19/2017 访问量:139

问:

我正在使用MSSQL并想实现该功能(根据使用ZF2,创建一个WITH语句?为此,我正在扩展类,添加添加函数所需的属性和方法。我现在如何告诉我的应用程序使用此 Select 类而不是 Zend 类?WITH\Zend\Db\Sql\SelectWITH

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

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

在查找 Zend 文件夹之前,它将在我的供应商文件夹中查找任何命名空间内容,但这需要我将整个 Zend Select 类复制到我的 Select 类中 - 这是不可取的,因为我的类不会从未来的补丁中受益到 Zend 分支。Sql

选择 zend-framework2 extending-classes

评论

0赞 Andrew 5/5/2017
为什么你甚至需要强制它加载到该命名空间中?手动实例化您自己的类以使用它。
0赞 Richard Parnaby-King 5/5/2017
我在模型中使用 TableGateways。这些实例化,而这些实例化又实例化。为了使用我的选择类,我必须创建一个新的表网关类和一个新的 sql 类,替换 和 的所有实例化。我希望有一个更优雅的解决方案 - 也许是模块引导类或全局配置文件中的几行?Zend\Db\Sql\SqlZend\Db\Sql\SelectSqlSelect

答:

0赞 Benjamin 5/19/2017 #1

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

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

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

如果你使用像 BetterReflection 这样的东西来动态加载和提取 'Zend' select 类的代码,你可以在代码中重命名该类(可能将其缓存在某个地方,因此不需要经常执行这个公认的昂贵操作)并从中扩展你的 select 类。将该扩展别名为原始类名将不是问题。

免责声明:我知道一些 Roave 拍品,尤其是所有在 BetterReflection 上被列为作者的人。他们是体面的,乐于助人的人,如果有点讨厌的话。