如何扩展 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 类,替换所有 Sql
和 Select
的实例。我希望有一个更优雅的解决方案 - 可能是模块引导类或全局配置文件中的几行?
【参考方案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 如何将小部件扩展为具有更多内容的更大小部件?
如何进行高效的源码阅读:以Spring Cache扩展为例带你搞清楚