Ich führe das Äquivalent dieses Codes in vielen und vielen Controller-Aktionen aus, im Grunde nimmt es den Benutzernamen des Benutzers, und wenn dieser Benutzername an eine Blog-Entität angehängt ist, erlaubt es dem Benutzer, die Blog-Entität (en) zu sehen. :
%Vor%Ich möchte es in einen Dienst verschieben, damit ich die Codewiederholung reduzieren kann. Ich möchte vermeiden, so viel Logik in meinen Controllern wie möglich zu tun.
Davon abgesehen bin ich mir nicht sicher, wie ich auf die Benutzersitzung und die Lehre in einem Dienst zugreifen kann.
Hier ist meine services.yml:
%Vor%Und so habe ich versucht, es im Controller zu nennen:
%Vor%Ich habe versucht, ein Event Abonnent / Listener -Tag zu verwenden, aber das scheint nicht zu sein um die Aufgabe zu erfüllen, die ich will.
Hier ist mein ganz schrecklicher Versuch eines Dienstes. Ich konnte keine Antwort erhalten, ohne einen Konstruktor zu benutzen.
%Vor%Gehe ich das völlig falsch? Gibt es einen besseren Weg, den ich vermisse?
hat meine Namenskonvention etwas modifiziert:
%Vor%In der Controller-Aktion:
%Vor%Im Dienst selbst:
%Vor%Benötigt immer noch zwei Zeilen, um die Variable $ entities im Controller zu erhalten, aber das ist viel besser, als das gleiche immer wieder zu definieren.
"Security.context" ist seit Symfony 2.6
veraltetNach einigen Diskussionen in der Community wurde entschieden, dass SecurityContext zu viele Abhängigkeiten zum Abrufen eines einfachen Token / User-Objekts gibt. Aus diesem Grund wurde der Dienst security.context ab Symfony 2.6 eingestellt und in zwei neue Dienste aufgeteilt: security.authorization_checker und security.token_storage.
Daher wäre der neue Weg dies zu tun: Konfigurieren Sie zuerst Ihren Dienst als:
%Vor%Dann im Konstruktor der Serviceklasse:
%Vor%Ja, Sie machen es falsch. Schauen wir uns Ihren Code an:
%Vor% Sie können den Entitymanager und security.context
in Ihrem Service nicht wie auf Ihrem Controller aufrufen. Stattdessen müssen Sie Entity Manager und security.context
services injizieren. Beispiel:
Und verbesserter Service:
%Vor%Weitere Informationen zu Dependency-Injektion
Sie suchen, wie Sie andere Dienste in Ihren benutzerdefinierten Dienst "injizieren" können. Sehen Sie sich die Dokumentation Service Container an.
In Ihrem Fall können Sie doctrine.orm.entity_manager
und security.context
services über die Konstruktorinjektion in Ihre BlogUser
Klasse einfügen. Zum Beispiel:
Und konfigurieren Sie Ihren Dienst wie folgt:
%Vor%Tags und Links controller service symfony fosuserbundle