Get-service-container von Entität in symfony 2.1 (Lehre)
Wie mit Entitäten wie service in der Lehre (Mit Symfony 2.1).
Beispiel:
<?php
namespace MyNamespace;
class MyEntity
{
protected $container = NULL;
public function __construct($container)
{
$this->container = $container;
}
/**
* @ORM\PrePersist
*/
public function()
{
//Must call to container and get any parameters
//for defaults sets entity parameters
$this->container->get('service.name');
}
}
Als Ergebnis, die ich brauche, um Zugang zu den gesamten container.
Eine Entität ist ein value-Objekt, und als solche kann nicht ein service. (Der Dienst, der container würde immer wieder die gleiche Person.)
InformationsquelleAutor ZhukV | 2012-10-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Entität ist ein Daten-Modell und sollten nur zum halten von Daten (und nicht irgendwelche Abhängigkeiten von services). Wenn Sie ändern möchten, Ihr Modell im Falle eines bestimmten Ereignisses (PrePersist in deinem Fall) sollte man schauen, in eine Lehre Zuhörer. Können Sie Spritzen den Behälter bei der Definition der Hörer:
your_service_dependency_or_the_container_here
. Wie würden Sie die$dataManager
und die$filterManager
, die mit Ihrer Lösung?Ja, Sie sagte "
and should only hold data
". Aber wenn diese Daten ist eine Datei, es ist noch immer eine Daten, richtig? Wir müssen nur wissen, wo gesagt, , wenn und wie zu setzen. So, vielleicht ist es "theoretisch" gut, in der Praxis ist es eine undichte Abstraktion. Lesen Sie diese: joelonsoftware.com/articles/LeakyAbstractions.html und Sie werden verstehen, meine Sicht ist: wenn Sie denken, Sie gewinnen Zeit durch die Abstraktion, die Sie immer erreichen einen Punkt, wo man Locker mehr Zeit in die Behandlung von Ausnahmen mit zu viel "Abstraktion".Also ja, Theorie "Daten-Modell sollten nur zum halten von Daten, in der Praxis, es ist eine undichte Abstraktion: Sie haben so viel code "um ihn herum" zu halten, "gute " Abstraktion" , es kostet Zeit (und damit Geld) in die Entwicklung und Wartung.
InformationsquelleAutor Kristian Zondervan
EDIT: DIES IST NICHT DER BEVORZUGTE WEG,, es ist der einzige Weg, um service-container in ein Unternehmen, es ist nicht eine gute Praxis, es sollte vermieden werden, aber das nur die Frage beantwortet.
In Fall, dass Sie möchten, dass der Behälter und/oder der repository-Sie können Sie erweitern eine Basis abastractEntity wie diese:
Bessere Nutzung Lehre-Ereignis-listener mit postLoad-Ereignis.
Für mich ist dies die richtige Antwort (D. H. die Art und Weise, um die container von überall). Es ist hacky, aber es ist richtig!
Siehe meine Kommentare bei "Kristian Zondervan"'s Antwort. Alex88 Antwort ist besser, denn es geht um das leaky abstraction.
Verwenden Sie diese, wenn Sie benötigen, um ein problem zu lösen sofort. Dann überarbeiten Sie den code verwenden, die ein service-listener, wenn Sie Zeit bekommen. Anyways, erstaunliche hack zu haben, auf die Hände.
InformationsquelleAutor alex88