CakePHP: get user info in den Modellen
Bin ich bewegte einige meiner code innerhalb von Modellen.
Zuvor in meinem controller musste ich
$this->Book->Review->find('first', array(
'conditions' => array(
'Review.book_id' => $id,
'Review.user_id' => $this->Auth->user('id')
)
));
also in meinem Review-Modell, das ich etwas wie
function own($id) {
$this->contain();
$review = $this->find('first', array(
'conditions' => array(
'Review.book_id' => $id,
'Review.user_id' => AuthComponent::user('id')
)
));
return $review;
}
So, ich bin Aufruf AuthComponent statisch aus dem Modell. Ich weiß, ich kann dies für die Methode, die AuthComponent::password(), was nützlich ist, für die Validierung. Aber ich bin immer Fehler mit der Methode AuthComponent::user(), insbesondere
Fatal error: Call to a member function
check() on a non-object in
/var/www/MathOnline/cake/libs/controller/components/auth.php
auf der Linie 663
Gibt es eine Möglichkeit, um die Informationen über den aktuell angemeldeten Benutzer aus einem Modell?
InformationsquelleAutor Andrea | 2010-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine schöne Lösung von Matt Curry. Sie speichern die Daten des angemeldeten Benutzers in der app_controller mit der beforeFilter hinzu Rückruf und für späteren Zugriff über statische Aufrufe. Eine Beschreibung kann hier gefunden werden:
http://www.pseudocoder.com/archives/2008/10/06/accessing-user-sessions-from-models-or-anywhere-in-cakephp-revealed/
EDIT: der link oben ist veraltet: https://github.com/mcurry/cakephp_static_user
Der link verreckt
er machte ein plugin für diese Funktion.. siehe edit oben
InformationsquelleAutor harpax
Erstellen Sie eine neue Funktion in der "app_model.php" ("AppModel.php" in CakePHP 2.x), so ist es bei allen Modellen, innerhalb unserer Anwendung:
im Modell:
InformationsquelleAutor Armand Macintosh
Die Art und Weise, die ich benutze ist diese:
Es scheint zu funktionieren ganz gut 🙂
funktioniert auch auf 2.6.0
funktioniert in Version 2.9.1. Ich brauchte nicht die App:import.
InformationsquelleAutor Ben Hitchcock
Ich denke, der code ist in Ordnung, so wie es ist und gehört in den Controller, oder zumindest es zu erhalten braucht die ids aus dem Controller und nicht versuchen, Sie selbst. Das Modell sollte nur darum gehen, abrufen von Daten von einer datenspeicher-und Rückgabe. Es müssen nicht besorgt sein, wie die Daten behandelt wird, die im rest der Anwendung oder dem die Parameter, die zu seiner Anfrage aus. Sonst malen Sie sich in eine Ecke, wo die ReviewModel können nur Daten abrufen, für die angemeldeten Benutzer, die möglicherweise nicht immer das sein, was Sie wollen.
Als solche, würde ich eine Funktion verwenden, Signatur wie diese:
Nur um ein paar Beispiele, indem Sie Ihre Modell-Methode erwartet einen controller (mit session-Daten), können Sie nicht mehr leicht zu verwenden, dass die Modell-Methode in Schalen-oder test-Fällen (in denen es kein controller oder session).
Guter Punkt, auch. Diese Bewegung kann zu unnötigen Abhängigkeiten, nur um des Sparens Willen ~20 Zeichen code...
InformationsquelleAutor deceze
Schmutzigsten Weg wäre, um nur den Zugriff auf die Benutzer-Informationen in der Sitzung. Geringsten Aufwand verbunden.
Der "richtige" Weg wäre wahrscheinlich zu instanziieren, die AuthComponent-Objekt, so dass es nicht all die Dinge, die es braucht, um voll funktionsfähig sein. Ähnlich wie ein Todesstern, der AuthComponent nicht wirklich gut funktionieren, wenn nicht vollständig eingerichtet.
Bekommen einen neuen AC-Objekt, in das Modell:
Nun kann man mit $this->Auth in das Modell, die gleiche, als würden Sie in der controller.
Die Instanziierung der Modelle selbst, vor allem, Steuerungen oder Komponenten, ist heikle Sache. Bessere Nutzung
ClassRegistry::getInstance()
oderClassRegistry::init()
(aus der Spitze von meinem Kopf).empfehlen Sie die Verwendung dieser Funktionen (statt dessen) immer eher als App::import? Ich habe die App::import für Modelle, die innerhalb AppController schon ein paar mal, hatte nie irgendwelche probs. Aber ich bin bereit zu ändern, wenn Sie denken, es ist ein besserer Weg, es zu tun -- tun Sie es empfehlen?
Die Sache ist die,
App::import()
nurimports
.php Datei mit der Klasse nicht instanziieren nichts. Einige Klassen davon abhängen, bestimmte Argumente zu Ihren Konstruktor, Komponenten, zum Beispiel erwarten eine Referenz auf einen Controller. Der beste Weg, um zu konstruieren Klassen korrekt ist, einfach eine bereits vorhandene Instanz von ClassRegistry (spart Speicher). Sonst lassen Sie es zu ClassRegistry zu instanziieren der Klasse (nicht sicher, ob es es für Komponenten, die leicht).In CakePHP 2.2. die syntax ist:
App::uses('AuthComponent', 'Controller/Component');
$this->Auth = new AuthComponent();
InformationsquelleAutor Travis Leleu
Ich denke, das ist keine gute Idee, um den Wert von Session. Bessere Lösung zu bekommen, protokolliert Benutzer-id in jedem Modell einfach versuchen, diese:
Diese arbeiten fast jede wo. Ansicht, Modell und Steuerung
InformationsquelleAutor Fury
Für CakePHP 3.x diese einfache Komponente zur Verfügung steht: http://cakemanager.org/docs/utils/1.0/components/globalauth/. Direkter Zugriff auf die Sitzung nicht möglich, weil von verschiedenen SessionKeys.
Mit der GlobalAuthComponent können Sie auf Ihre Benutzer-Daten überall mit:
Configure::read('GlobalAuth');
.Greetz
Bob
InformationsquelleAutor Bob
Ich benutze Kuchen 2.2 und diese beiden funktionieren Super:
Können Sie auch einen Bereich der aktuell angemeldete Benutzer:
Im beforeFilter hinzu der Steuerung, weisen Sie Benutzer-Variablen in das Modell die variable: $this->MyModel->user = $this->Session->read('Auth.user'); rufen Sie Nun 'Benutzer' in Ihr Modell.
Das einzige Problem mit diesem ist, dann ordnen Sie es für jedes einzelne Modell, was bedeutet, dass Sie gehen, um am Ende mit viel Speicherverbrauch.
Eigentlich ist dies das gleiche, als akzeptierte Lösung, außer, dass ich Ihnen sagte, dass es in den controller, den Sie brauchen. Aber die akzeptierte Lösung schlägt vor, dass es in-app-controller, was bedeutet, wörtlich mehr Speicher als nur im controller benötigt.
Wenn Sie brauchen, diese in mehr als einem controller code-Duplizierung erscheint. Und Sie wäre die Kopplung jeder controller auf eine bestimmte Implementierung. Dies sollte auf jeden Fall gehen in das Modell ein. Oder zumindest in eine Komponente, wo Sie könnte sich ändern, die Implementierung nur einmal.
InformationsquelleAutor 1.44mb
Keine dieser Lösungen funktioniert in CakePHP version 3. Wer kennt eine Möglichkeit, dies zu tun? Jetzt bin ich Total stepping um den Rahmen, durch den Zugriff auf die $_SESSION-variable direkt aus meinem Modell.
Verstanden, aber wie bekommt man Zugriff auf das session-Objekt von einem Modell dann in 3.0? Die einzige Möglichkeit, die ich gefunden habe, es zu tun ist über $_SESSION
Ich habe die folgenden, um die auth-Daten überall... cakemanager.org/docs/utils/1.0/components/globalauth. Es ist etwas,;) ... Und nützlich!
InformationsquelleAutor Eric Hendrickson