2017-05-04 40 views
6

我正在使用MSSQL並希望實現WITH函數(根據Using ZF2, create a WITH statement?)。爲此,我擴展了\Zend\Db\Sql\Select類,添加了添加WITH函數所需的屬性和方法。現在我該如何告訴我的應用程序使用這個Select類而不是Zend?如何擴展Zend Db Sql Select?

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

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

將看在我的供應商文件夾中任何Sql命名空間的東西看在Zend的文件夾之前,但是這需要我來複制zend select類的全部內容放入我的選擇類中 - 這是不可取的,因爲我的類不會從將來的補丁中受益於zend分支。

+0

爲什麼你甚至需要強制它加載該命名空間?手動實例化你自己的類來使用它.. – Andrew

+0

我在我的模型中使用TableGateways。這些實例化'Zend \ Db \ Sql \ Sql',然後實例化'Zend \ Db \ Sql \ Select'。爲了讓我選擇的類被使用,我將不得不創建一個新的表格網關類和一個新的sql類,在我去的時候替換'Sql'和'Select'的所有實例。我希望有一個更優雅的解決方案 - 可能是模塊引導類或全局配置文件中的少數幾行? –

回答

0

嘗試使用在你的引導腳本class_alias()指令別名您Select替代類(命名空間),以ZF2的Select類的完整的命名空間 -

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

不幸的是這僅僅是一個自動加載的更有針對性的版本定義你上面給出的,不幸的是,你仍然不得不重新實現Select類的版本,以包含Zend Select類中的所有當前代碼,因爲據我所知,沒有功能可以將一個類從另一個類擴展到別名在原來的擴展類。

如果您使用類似BetterReflection的動態加載和提取'Zend'選擇類的代碼,您可以在您的代碼中重命名該類,(可能將其緩存在某處,因此這種公認的昂貴的操作不需要不斷執行)並從中擴展你的選擇課程。將別名擴展到您的原始類名將不成問題。免責聲明:我知道一些Roave很多,尤其是那些被列爲BetterReflection作者的所有人。他們是體面的,有幫助的人,如果有些勉強。