Symfony2 Zugriff auf Benutzer und Doktrin in einem Dienst

8

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?

EDIT / ANTWORT:

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.

    
gan 14.08.2013, 05:41
quelle

3 Antworten

11

"Security.context" ist seit Symfony 2.6

veraltet
  

Nach 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.

Quelle

Daher wäre der neue Weg dies zu tun: Konfigurieren Sie zuerst Ihren Dienst als:

%Vor%

Dann im Konstruktor der Serviceklasse:

%Vor%     
Sawant 23.08.2016, 10:29
quelle
5

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:

%Vor%

Und verbesserter Service:

%Vor%

Weitere Informationen zu Dependency-Injektion

    
NHG 14.08.2013 06:08
quelle
2

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:

%Vor%

Und konfigurieren Sie Ihren Dienst wie folgt:

%Vor%     
dezull 14.08.2013 06:03
quelle