2016-07-13 3 views
0

Ich muss Änderungen an diesem symfony Klasse machen:Over-ride a Symfony Komponentenklasse

Symfony\Component\Translation\MessageCatalogue 

Wer weiß, wie ich Symfony zwingen kann meine eigene Variante dieser Klasse zu bedienen? Ich möchte nicht die eigentlichen Kerndateien manipulieren, nur für den Fall.

+0

Symphony verwendet Dependency Injection so DI Konfiguration sho verändern ähm, was du suchst. –

+0

welche Version von Symfony? – Jaxian

+0

@MarcinOrlowski 'MessageCatalogue' ist kein in der DI registrierter Dienst, so dass er nicht auf diese Weise überschrieben werden kann. Es gibt direkte Verweise darauf im Code (z. B. "new MessageCatalogue"). – ShiraNai7

Antwort

3

Die Klasse ist kein Dienst, der im Abhängigkeitsinjektionscontainer registriert ist, sodass er nicht mit den Standardmethoden überschrieben werden kann (Klassenname parameter/compiler pass). Es wird direkt in dem Symfony-Code verwendet, z.B. new MessageCatalogue().

Wenn Sie wirklich brauchen, um es zu überschreiben, können Sie dies tun, indem Sie die Klassenposition explizit im Klassenlader festlegen. Klassenkarten haben Vorrang vor PSR-0/PSR-4-Präfixen.

$loader = require __DIR__ . '/../vendor/autoload.php'; 

$loader->addClassMap([ 
    'Symfony\Component\Translation\MessageCatalogue' => 'path/to/your/override.php', 
]); 

Die Nachteile sind:

  • es ein bisschen hackish ist - ich dies nur als letztes Mittel tun würde
  • Sie können die ursprünglichen Klasse nicht verlängern, müssen Sie neu zu implementieren es oder copy-paste den Code
  • Sie sich daran zu erinnern, es zu aktualisieren, wenn Sie Symfony aktualisieren
+0

Tatsächlich gibt es viele Nachteile. Vielleicht @Jaxian können Sie den Konstruktor-Code überschreiben, ich meine, wo ein neues() getan wird? – romaricdrigon

+0

Ich werde dies als Antwort akzeptieren, da es wie eine brauchbare Lösung aussieht, obwohl wir beschlossen haben, mit dieser Situation umzugehen, indem wir stattdessen einen dedizierten Bericht erstellen, der die Notwendigkeit beseitigt, sich mit den Kerndateien herumzuärgern. – steelpush