2017-05-04 64 views
6

Używam MSSQL i chcę zaimplementować funkcję WITH (zgodnie z Using ZF2, create a WITH statement?). W tym celu rozszerzam klasę \Zend\Db\Sql\Select dodając właściwości i metody wymagane do dodania funkcji WITH. Jak mam teraz poinformować moją aplikację, aby używała tej klasy Select zamiast Zend?Jak przedłużyć Zend Db Sql Select?

Jednym ze sposobów jest określić autoload w moim pliku composer.json:

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

który będzie wyglądać w moim folderze dostawcy dla każdej rzeczy Sql namespace zanim patrząc w folderze zend, ale wymaga to mnie do skopiowania całość zend wybierz klasę do mojej klasy select - jest to niepożądane, ponieważ moja klasa nie będzie korzystać z przyszłych poprawek do gałęzi zend.

+0

Dlaczego musisz wymusić załadowanie go w tym obszarze nazw? ręcznie stwórz własną klasę, aby z niej korzystać .. – Andrew

+0

Używam TableGateways w moich modelach. Te instancyjne 'Zend \ Db \ Sql \ Sql', które z kolei tworzą instancję' Zend \ Db \ Sql \ Select'. Aby uzyskać dostęp do mojej klasy select, musiałbym utworzyć nową klasę bramy tabeli i nową klasę sql, zastępując wszystkie wystąpienia z 'Sql' i' Select' w trakcie pracy. Mam nadzieję, że istnieje bardziej eleganckie rozwiązanie - być może kilka linii w module bootstrap lub globalnym pliku konfiguracyjnym? –

Odpowiedz

0

Spróbuj użyć dyrektywy class_alias() w bootstrap skryptu do aliasu swoją Select klasy zastępczej (z przestrzeni nazw) do pełnej przestrzeni nazw ZF2 za Select klasy -

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

Niestety jest to tylko bardziej ukierunkowane wersja autoload Definicja, którą podałeś powyżej, niestety nadal będziesz musiał ponownie zaimplementować swoją wersję klasy Select, aby uwzględnić cały aktualny kod w klasie Zend Select, o ile wiem, nie ma funkcji rozszerzania jednej klasy od drugiej, a następnie aliasu klasa rozszerzona w stosunku do oryginału.

Jeśli używasz czegoś takiego jak BetterReflection do dynamicznego ładowania i wyodrębniania kodu z klasy "Zend" select, możesz zmienić nazwę klasy w swoim kodzie (prawdopodobnie gdzieś ją przechowujesz, więc ta wprawdzie droga operacja nie musi być wykonywane stale) i rozszerz swoją wybraną klasę. Aliasing tego rozszerzenia do oryginalnej nazwy klasy nie stanowiłby problemu.

Nota prawna: Znam niektóre z partii Roave, w szczególności wszystkie wymienione na liście autorów na stronie BetterReflection. Są przyzwoitymi, pomocnymi facetami, jeśli są nieco prymitywni.