Montag, Mai 25, 2020

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

9 Kommentare

  1. 3

    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

    Vielen Dank, das scheint die beste Lösung!
    Der link verreckt
    er machte ein plugin für diese Funktion.. siehe edit oben

    InformationsquelleAutor harpax

  2. 13

    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:

    function getCurrentUser() {
      //for CakePHP 1.x:
      App::import('Component','Session');
      $Session = new SessionComponent();
    
      //for CakePHP 2.x:
      App::uses('CakeSession', 'Model/Datasource');
      $Session = new CakeSession();
    
    
      $user = $Session->read('Auth.User');
    
      return $user;
    }

    im Modell:

    $user = $this->getCurrentUser();
    $user_id = $user['id'];
    $username = $user['username'];

    InformationsquelleAutor Armand Macintosh

  3. 10

    Die Art und Weise, die ich benutze ist diese:

    App::import('component', 'CakeSession');        
    $thisUserID = CakeSession::read('Auth.User.id');

    Es scheint zu funktionieren ganz gut 🙂

    Getestet auf Kuchen/2.2.x, funktioniert einwandfrei.
    funktioniert auch auf 2.6.0
    funktioniert in Version 2.9.1. Ich brauchte nicht die App:import.

    InformationsquelleAutor Ben Hitchcock

  4. 6

    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:

    function findByBookAndUserId($book_id, $user_id) {
        
    }
    
    $this->Review->findByBookAndUserId($id, $this->Auth->user('id'));
    Ich habe viele Anfrage, dass lediglich die fetch-Daten in Bezug auf den aktuellen Benutzer. Versuche gerade den code vereinfachen, ohne zu müssen, übergeben Sie die Benutzer-id überall.
    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

  5. 1

    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:

    App::import( 'Component', 'Auth' );
    $this->Auth = new AuthComponent();

    Nun kann man mit $this->Auth in das Modell, die gleiche, als würden Sie in der controller.

    Notice (8): Undefined property: AuthComponent::$Session [CORE/cake/libs/controller/components/auth.php, line 663] Fatal error: Call to a member function check() on a non-object in /var/www/MathOnline/cake/libs/controller/components/auth.php on line 663
    Die Instanziierung der Modelle selbst, vor allem, Steuerungen oder Komponenten, ist heikle Sache. Bessere Nutzung ClassRegistry::getInstance() oder ClassRegistry::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() nur imports.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

  6. 1

    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:

    AuthComponent::user('id');

    Diese arbeiten fast jede wo. Ansicht, Modell und Steuerung

    InformationsquelleAutor Fury

  7. 0

    Ich benutze Kuchen 2.2 und diese beiden funktionieren Super:

    $this->Session->read('Auth.User');
    //or
    $this->Auth->user();

    Können Sie auch einen Bereich der aktuell angemeldete Benutzer:

    $this->Session->read('Auth.User.email');
    //or
    $this->Auth->user()['email'];
    Nicht in einem Modell obwohl.
    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

  8. 0

    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.

    Dies ist nicht empfehlenswert, Sie mit Kuchen: book.cakephp.org/3.0/en/development/sessions.html#sessions: die Verwendung von $_SESSION wird im Allgemeinen vermieden, in CakePHP
    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

Kostenlose Online-Tests