Heim >Backend-Entwicklung >PHP-Tutorial >Ein tiefes Eintauchen in Sessions in Laravel

Ein tiefes Eintauchen in Sessions in Laravel

Karen Carpenter
Karen CarpenterOriginal
2025-03-06 02:32:13357Durchsuche

A Deep Dive into Sessions in Laravel

Beim Erstellen einer Laravel -Anwendung sind Sie fast sicher, dass Sie die Sitzung irgendwann abwickeln müssen. Sie sind der grundlegende Teil der Webentwicklung.

In diesem Artikel wird schnell erklärt, welche Sitzungen sind, wie sie in Laravel arbeiten und wie Sie sie in Laravel -Anwendungen verwenden.

Wir werden dann noch einen Schritt weiter gehen und in die Interaktion mit Sitzungen mit "Sitzungsklassen" eingehen, um die gemeinsamen Fallstricke zu vermeiden, denen ich häufig beim Umgang mit Laravel -Anwendungen begegnen kann.

Schließlich werden wir lernen, wie man Sitzungsdaten in Laravel testet.

Was ist ein Gespräch?


standardmäßig sind Webanwendungen staatenlos, was bedeutet, dass Anfragen normalerweise nicht kennen. Daher benötigen wir eine Möglichkeit, Daten zwischen Anfragen zu speichern. Wenn sich Benutzer beispielsweise auf einer Website anmelden, müssen wir uns daran erinnern, dass sie während ihres Besuchs angemeldet sind. Hier kommt das Gespräch ins Spiel.

Kurz gesagt, eine Sitzung ist eine sichere Möglichkeit, Daten zwischen mehreren Anforderungen zu bestehen.

Sitzungsdaten können verwendet werden, um den folgenden Inhalt zu speichern:

    Benutzerauthentifizierungsstatus.
  • Temporäre Daten auf einer anderen Seite zugänglich.
  • Flash -Nachricht, die dem Benutzer angezeigt wird.
Sitzungsdaten können an verschiedenen Stellen gespeichert werden, wie z. B.

    Cookie
  • Datenbank
  • Cache -Speicher (z. B. Redis)
Wie funktioniert eine Sitzung in Laravel?


Um zu verstehen, welche Sitzungen sind, lassen Sie uns sehen, wie sie in Laravel arbeiten.

Folgende Beispieldaten, die Sie möglicherweise in einer Sitzung in einer Laravel -Anwendung finden:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>
Lassen Sie uns das, was jeder Schlüssel darstellen könnte, aufschlüsseln.

Die folgenden Schlüssel werden vom Laravel -Framework selbst hinzugefügt:

Der Wert
  • wird verwendet, um CSRF -Angriffe zu verhindern. _token Der Wert
  • wird verwendet, um die zuvor angeforderte URL zu speichern. _previous.url
  • Der Wert wird verwendet, um die Tasten der Flash -Sitzungsdaten in einer vorherigen Anforderung zu speichern. In diesem Fall bedeutet dies, dass der Wert _flash.old in einer früheren Anfrage geblitzt wurde. success
  • Der Wert wird verwendet, um die Schlüssel der Flash -Sitzungsdaten in der aktuellen Anforderung zu speichern. _flash.new
Die folgenden Schlüssel werden von mir hinzugefügt:

  • Wert wird verwendet, um Erfolgsnachrichten zu speichern, die dem Benutzer angezeigt werden können. success Der Wert
  • wird verwendet, um die ID des aktuellen Teams zu speichern, den der Benutzer anzeigt. current_team_id
standardmäßig unterstützt Laravel die folgenden Sitzungstreiber:

  • cookie - Sitzungsdaten werden in sicheren und verschlüsselten Cookies gespeichert.
  • database - Sitzungen werden in Ihrer Datenbank gespeichert (z. B. MySQL, PostgreSQL, SQLite).
  • memcached / redis - Sitzungsdaten werden in diesem schnellen Cache -Speicher gespeichert.
  • dynamodb - Sitzungsdaten werden in AWS DynamoDB gespeichert.
  • file - Sitzungsdaten werden in storage/framework/sessions gespeichert.
  • array - Sitzungsdaten werden in PHP -Arrays im Speicher gespeichert und nicht bestehen.

Einige dieser Treiber haben Einrichtungsanforderungen. Überprüfen Sie vor der Verwendung unbedingt die Laravel -Dokumentation, um zu erfahren, wie Sie sie einrichten.

Verwenden von Sitzungen in Laravel


Laravel macht die Verwendung von Sitzungen sehr einfach. In der Dokumentation wird erläutert, wie man mit einer Sitzung gut interagiert. Aber werfen wir einen kurzen Blick auf die Grundlagen.

Für unser Beispiel werden wir davon ausgehen, dass wir einen Schritt-für-Schritt-Assistenten auf mehreren Seiten erstellen. Wir werden den aktuellen Schritt und die in jedem Schritt eingegebenen Daten in die Sitzung speichern. Auf diese Weise können wir, wenn der Benutzer alle Schritte ausführt, alle eingereichten Daten am Ende des Assistenten lesen.

Um das Beispiel einfach zu machen, werden wir auch die Funktion session() Helfer verwenden. Später werden wir jedoch mithilfe der Fassade Session oder der Anforderungsklasse zu Aufzugsaufnahmedaten diskutieren.

# Daten aus Sitzung

lesen

Um Daten aus einer Sitzung zu lesen, können Sie die Methode get wie folgt verwenden:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

Ausführen des oben genannten Codes gibt den in der Sitzung gespeicherten Wert als wizard:current_step -Staste zurück. Wenn der Schlüssel in der Sitzung keinen gespeicherten Wert hat, gibt er null zurück.

Mit dieser Methode können Sie auch einen Standardwert definieren, der zurückgibt:

Wenn der Schlüssel nicht vorhanden ist:
<code>$currentStep = session()->get(key: 'wizard:current_step');</code>

Ausführen des oben genannten Codes gibt den in der Sitzung gespeicherten Wert als wizard:current_step -Staste zurück. Wenn der Schlüssel in der Sitzung keinen gespeicherten Wert hat, gibt er 1 zurück.

Es kann auch Zeiten geben, in denen Sie Daten aus der Sitzung lesen und gleichzeitig löschen möchten (so dass nicht wieder zugegriffen werden kann). Sie können die pull -Funktion dafür verwenden:

<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

Ausführen des oben genannten Codes gibt den in der Sitzung gespeicherten Wert als wizard:current_step -Taste zurück und löscht ihn dann aus der Sitzung.

# Schreiben Sie Daten in Sitzung

Um Daten in eine Sitzung zu schreiben, können Sie die unten gezeigte put -Funktion verwenden:

<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

Ausführen des oben genannten Codes speichert das Array (übergeben im zweiten Parameter) als Wert der wizard:step_one:form_data -Taste.

# Daten in ein Array in der Sitzung

in ein Array verschieben

In ähnlicher Weise können Sie auch die Methode push verwenden, um Daten in der Sitzung in ein Array zu drücken:

<code>session()->put(
    key: 'wizard:step_one:form_data',
    value: [
        'name' => 'Ash Allen',
        'email' => 'ash@example.com',
    ],
);</code>

Angenommen, der wizard:step_one:form_data:languages -Staste hat die folgenden Daten:

<code>session()->push(
    key: 'wizard:step_one:form_data:languages',
    value: 'javascript',
);</code>

Der obige Code (Aufruf der Methode push) aktualisiert den Sitzungswert:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

Wenn der Wert wizard:step_one:form_data:languages in der Sitzung noch nicht vorhanden ist, verwenden Sie push, um einen Sitzungsschlüssel zu erstellen und den Wert auf ein Array zu setzen, das die von Ihnen übergebenen Werte enthält.

# Erhöhen und Verringerung der Daten in Sitzung

laravel bietet auch einige praktische Helfermethoden, mit denen Sie die Werte in einer Sitzung erhöhen und verringern können:

Sie können den Wert in der Sitzung wie folgt erhöhen:

<code>$currentStep = session()->get(key: 'wizard:current_step');</code>

Wenn wir den oben genannten Code ausführen, erhöht sich der Sitzungswert wizard:current_step, wenn er 3 ist, nun auf 4.

Sie können auch den Wert in der Sitzung wie folgt reduzieren:

<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

Wenn die Werte in der Sitzung noch nicht existieren, werden sie als 0 behandelt. Wenn Sie increment auf dem leeren Sitzungswert aufrufen, wird der Wert auf 1 festgelegt. Rufen Sie decrement auf den leeren Sitzungswert auf, setzen Sie den Wert auf -1.

Beide Methoden ermöglichen es Ihnen, die Anzahl der zu erhöhten oder verringenden Anzahl anzugeben:

<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

# Daten aus Sitzung

löschen

Sie können auch Daten aus der Sitzung mit der Methode forget löschen:

<code>session()->put(
    key: 'wizard:step_one:form_data',
    value: [
        'name' => 'Ash Allen',
        'email' => 'ash@example.com',
    ],
);</code>

Ausführen des oben genannten Codes löscht Daten, die zur wizard:current_step -Staste aus der Sitzung gehören.

Wenn Sie mehrere Schlüssel gleichzeitig löschen möchten, können Sie das Schlüsselarray an die Funktion forget übergeben:

<code>session()->push(
    key: 'wizard:step_one:form_data:languages',
    value: 'javascript',
);</code>

oder, wenn Sie alle Daten aus der Sitzung löschen möchten, können Sie die Funktion flush verwenden:

<code>[
    `php`,
]</code>

# Überprüfen Sie, ob in der Sitzung

Daten vorhanden sind

Laravel bietet auch einige bequeme Helferfunktionen, um zu überprüfen, ob Daten in der Sitzung vorhanden sind.

Sie können mit der Methode has überprüft werden, ob in der Sitzung ein Schlüssel vorhanden ist und ob ihr Wert nicht null:

ist
<code>[
    `php`,
    `javascript`,
]</code>

Wenn der Wert existiert und nicht null ist, gibt der obige Code true zurück. Wenn der Wert null oder der Schlüssel nicht existiert, gibt er false zurück.

In ähnlicher Weise können Sie auch die Methode exists verwenden, um zu überprüfen, ob der Schlüssel in der Sitzung vorhanden ist (unabhängig davon, ob der Wert null ist):

<code>session()->increment(key: 'wizard:current_step');</code>

Sie können auch überprüfen, ob die Sitzung überhaupt nicht vorhanden ist:

<code>session()->decrement(key: 'wizard:current_step');</code>

# Flash -Daten zur Sitzung

Manchmal möchten Sie einige Daten in der Sitzung bestehen, jedoch nur für die nächste Anfrage. Zum Beispiel möchten Sie dem Benutzer eine Erfolgsbenachrichtigung zeigen, nachdem der Benutzer das Formular eingereicht hat.

, um dies zu tun, können Sie flash Methode verwenden:

<code>session()->increment(key: 'wizard:current_step', amount: 2);
session()->decrement(key: 'wizard:current_step', amount: 2);</code>

Wenn Sie den oben genannten Code in der nächsten Anfrage ausführen möchten, können Sie den Wert aus der Sitzung (mit etwas wie session()->get('success')) für die Anzeige lesen. Löschen Sie es dann so, dass es in der nächsten Anfrage nicht verfügbar ist.

Es kann sein, dass Sie manchmal einige Flash -Daten haben (in einer früheren Anfrage hinzugefügt) und sie auf die nächste Anforderung beibehalten möchten.

Sie können alle Flash -Daten mit der Methode reflash aktualisieren:

<code>session()->forget(keys: 'wizard:current_step');</code>

oder, wenn Sie nur einige Flash -Daten aufbewahren möchten, können Sie keep Methode verwenden:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

Ausführen des oben genannten Codes behält die Werte success und error Flash -Sitzung bei, löscht jedoch alle anderen Flash -Daten für die nächste Anforderung.

Hilfefunktion, Fassade oder Anforderungsklasse?


Bisher haben wir in unseren Beispielen nur die Helferfunktion session() verwendet.

, aber Sie können auch die Fassade oder IlluminateSupportFacadesSession -Klasse verwenden, um mit der Sitzung zu interagieren. IlluminateHttpRequest

Unabhängig davon, welche Methode Sie verwenden, können Sie die gleiche Methode, die in diesem Artikel früher beschrieben wurde, weiterhin verwenden. Diese Methoden sind nur unterschiedliche Möglichkeiten, um mit Sitzungsdaten zu interagieren.

Um die Fassade

zu verwenden, können Sie die Methode wie folgt aufrufen: Session

<code>$currentStep = session()->get(key: 'wizard:current_step');</code>
Alternativ können Sie auf die Sitzung zugreifen, indem Sie die in die Controller -Methode injizierte

-Methode aufrufen. Angenommen, Sie haben die folgende Controller -Methode: IlluminateHttpRequest session

Jede Methode ist vollständig effektiv, sodass Sie entscheiden können, welches Sie und Ihr Team bevorzugen.
<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

gehen Sie noch einen Schritt weiter

Für kleinere Projekte ist es vollkommen in Ordnung, mit den zuvor diskutierten Methoden mit der Sitzung zu interagieren. Wenn das Laravel -Projekt jedoch wächst, können Sie jedoch auf Probleme stoßen, die Fehler verursachen und Ihren Code schwieriger zu pflegen können.

Wir werden jetzt einige mögliche Fallstricke abdecken und wie man sie vermeidet.

# typo in Sitzungsschlüssel

Eine häufige Falle, die ich sehe (ich habe sie selbst oft erlebt) ist ein Tippfehler im Sitzungsschlüssel.

Bleiben Sie bei unserem Assistentenbeispiel, vorausgesetzt, wir möchten den aktuellen Schritt in der Sitzung speichern. Daher könnte unser Code so aussehen:

Dann möchten wir später in verschiedenen Teilen der Codebasis den aktuellen Schritt aus der Sitzung lesen:
<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

Hast du den Fehler gesehen, den ich gerade gemacht habe? Ich habe versehentlich versucht, die
<code>session()->put(
    key: 'wizard:step_one:form_data',
    value: [
        'name' => 'Ash Allen',
        'email' => 'ash@example.com',
    ],
);</code>
-Staste anstelle der

-Staste zu lesen. wizard:step wizard:current_step Dies ist ein einfaches Beispiel, aber in großen Codebasen ist es einfach, solche Fehler zu machen. Diese offensichtlichen Fehler können auch am schwierigsten zu finden sein.

Ein nützlicher Weg, um diese Tippfehler zu vermeiden, besteht daher darin, Konstanten oder Methoden zur Generierung von Sitzungsschlüssel zu verwenden.

Wenn der Sitzungsschlüssel beispielsweise statisch ist, können Sie eine Konstante definieren (wahrscheinlich in der Sitzungsklasse, die wir später behandeln werden) wie folgt:

Dies bedeutet, dass wir die Anzahl der in der Codebasis verwendeten Rohschläge reduzieren, was die Anzahl der Tippfehler verringert.
<code>session()->push(
    key: 'wizard:step_one:form_data:languages',
    value: 'javascript',
);</code>

Manchmal müssen Sie jedoch möglicherweise dynamische Sitzungsschlüssel generieren. Nehmen wir beispielsweise an, wir möchten, dass unser

-Staste ein Team -ID -Feld enthält. Wir können eine Methode erstellen, um den Schlüssel wie folgt zu generieren:

wizard:current_step

Wie wir im obigen Code sehen können, generieren wir den Sitzungsschlüssel dynamisch, damit er in verschiedenen Methoden verwendet werden kann. Wenn wir beispielsweise versuchen, den aktuellen Schritt eines Teams mit ID 1 zu finden, lautet der Schlüssel
<code>[
    `php`,
]</code>
.

# Sitzungsschlüsselkonflikt

Eine weitere Falle, die ich beim Umgang mit einem Projekt sehe, das es schon seit einiger Zeit gibt, ist Sitzungsschlüsselkonflikt.

Stellen Sie sich zum Beispiel vor, dass Sie vor einigen Jahren einen Assistenten zum Erstellen neuer Benutzerkonten erstellt haben. Sie können also Sitzungsdaten wie folgt speichern:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

Sie wurden jetzt zugewiesen, um eine neue Funktion zu erstellen, die auch einen Zauberer hat, und Sie haben den alten Zauberer und die von Ihnen verwendete Namenskonvention vollständig vergessen. Sie können versehentlich den gleichen Schlüssel für den neuen Assistenten verwenden, um Datenkonflikte zu verursachen und potenzielle Fehler einzuführen.

Um dies zu vermeiden, benutze ich den Funktionsnamen gerne als Präfix für den Sitzungsschlüssel. Für das Speichern von Assistentendaten zum Erstellen neuer Benutzer habe ich möglicherweise die folgenden Schlüssel:

  • new_user_wizard:current_step
  • new_user_wizard:step_one:form_data
  • new_user_wizard:step_two:form_data
  • warte ...

Dann habe ich in meinem neuen Assistenten für die Erstellung eines neuen Teams die folgenden Schlüssel:

  • new_team_wizard:current_step
  • new_team_wizard:step_one:form_data
  • new_team_wizard:step_two:form_data
  • warte ...

Wir werden erklären, wie diese Präfixe später in diesem Artikel der Sitzungsklasse hinzugefügt werden.

# Unbekannter Datentyp

Können Sie mir sagen, wie der Datentyp in diesem Sitzungswert gespeichert ist?

<code>$currentStep = session()->get(key: 'wizard:current_step');</code>

Wenn Sie vermutet haben, dass es eine Instanz von AppDataTransferObjectsWizardsFormData war, haben Sie Recht.

Nur reden und reden, ich möchte klarstellen, dass beim Lesen von Daten aus einer Sitzung nicht immer klar ist, welche Art von Daten Sie verwenden. Am Ende müssen Sie sich den Code ansehen, der die Daten in die Sitzung schreibt, um herauszufinden, was er ist. Dies kann ablenkend und zeitaufwändig sein und zu Fehlern führen.

Sie können dem Code, der Sitzungsdaten liest, Kommentare oder Dokumentblöcke hinzufügen. Aber das ist nur ein Hinweis. Wenn der Kommentar nicht auf dem neuesten Stand ist (wenn sich der Sitzungsdatentyp ändert), hilft er nicht und erhöht die Wahrscheinlichkeit von Fehlern.

Eine andere Methode, die ich gerne verwende, besteht darin, die Sitzungsdaten innerhalb der Methode zu lesen und den Rückgabetyp zur Methode hinzuzufügen. Auf diese Weise können Sie sicherstellen, dass der von Ihnen verwendete Datentyp korrekt ist. Es hilft auch Ihrer IDE und den Personen, die den Code lesen.

Schauen wir uns zum Beispiel diesen Code an:

<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

Wir können jetzt sehen, dass die stepOneFormData -Methode eine AppDataTransferObjectsWizardsFormData -Schunierung zurückgibt. Dies zeigt deutlich die Art der Daten, die wir verwenden. Wir können diese Methode dann im Controller so aufrufen:

<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

# Sitzungsdaten in Sitzungsklasse

Wie wir in den vorherigen Abschnitten gesehen haben, gibt es bei der Verwendung von Sitzungen in Laravel einige einfache (aber allgemeine) Fallstricke.

Mit "Sitzungsklassen" kann jede dieser Fallen vermieden (oder zumindest reduziert) werden. Ich benutze gerne Sitzungsklassen, um die Sitzungsdatenverarbeitungslogik der Sitzung in Bezug auf eine einzelne Funktion an einem Ort zu verkörpern.

Angenommen, wir haben einen Assistenten zum Erstellen von Benutzern und einen anderen zum Erstellen von Teams. Ich werde für jeden dieser Assistenten eine Sitzungsklasse erstellen:

  • AppSessionsUsersNewUserWizardSession
  • AppSessionsTeamsNewTeamWizardSession

Mit der Sitzungsklasse können Sie:

  • Verwenden Sie den Funktionsnamen automatisch als Präfix für alle Schlüssel.
  • Fügen Sie der Methode eine Eingabeaufforderung und einen Rückgabetyp hinzu.
  • Reduzieren Sie die Anzahl der in der Codebasis verwendeten originalen Zeichenfolgen.
  • Refactoring -Sitzungsdatenstrukturen erleichtern.
  • Erleichterung von Testsitzungsdaten.
  • Wissen genau, wohin Sie gehen sollen, wenn Änderungen erforderlich sind, um die Sitzungsdaten für eine bestimmte Funktion vorzunehmen.

Verwenden Sie diesen klassenbasierten Ansatz bei der Verarbeitung von Sitzungsdaten erspart mir unzählige Male bei der Arbeit mit großen Laravel-Projekten. Dies ist eine einfache Methode, die einen großen Einfluss haben kann.

Im vorherigen Beispiel habe ich bereits vorgeschlagen, eine Sitzungsklasse zu verwenden. Aber schauen wir uns einen tieferen Blick darauf an, wie ich diese Klassen gerne baue.

Angenommen, wir haben die folgende Sitzungsklasse für den neuen Benutzerassistenten. Auf den ersten Blick mag es ein bisschen überwältigend sein, aber schauen wir uns den Code an und brechen Sie ihn auf:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

In der obigen AppSessionsUsersWizardSession -Klasses definieren wir zunächst den Konstruktor, der die IlluminateContractsSessionSession -Schelle akzeptiert. Auf diese Weise wird uns Laravel automatisch eine Sitzungsinstanz in uns injiziert, wenn wir die AppSessionsUsersWizardSession -Klasse aus dem Service -Container analysieren. Ich werde Ihnen später zeigen, wie man das im Controller macht.

Wir definieren dann 5 grundlegende öffentliche Methoden:

  • getCurrentStep - Kehren Sie zum aktuellen Schritt im Assistenten zurück. Wenn es keinen Setup -Schritt gibt, ist die Standardeinstellung 1.
  • setCurrentStep - Aktuelle Schritte im Setup -Assistenten.
  • setFormDataForStep - Stellen Sie die Formulardaten für den angegebenen Schritt im Assistenten fest. Diese Methode nimmt die Schrittnummer und AppDataTransferObjectsWizardsUsersFormData Beispiel an.
  • getFormDataForStep - Erhalten Sie die Formulardaten für den angegebenen Schritt im Assistenten. Diese Methode dauert eine Schrittnummer und gibt die AppDataTransferObjectsWizardsUsersFormData -Stanz zurück oder wenn die Daten nicht vorhanden sind. null
  • - Löschen Sie alle Daten, die sich mit dem Assistenten aus der Sitzung beziehen. Wenn der Assistent fertiggestellt oder storniert wurde, sollten Sie diese Methode aufrufen. flush
Sie haben möglicherweise festgestellt, dass alle Schlüssel innerhalb der Methode generiert werden. Ich mag es, dies zu tun, um die Anzahl der verwendeten rohen Saiten zu verringern (und die Wahrscheinlichkeit von Tippfehler zu verringern). Dies bedeutet auch, dass wir dies sehr einfach tun können, wenn wir einen weiteren Weg hinzufügen möchten, um auf einen bestimmten Schlüssel zuzugreifen.

Der zusätzliche Vorteil der Verwendung dieser Schlüsselgenerierungsmethoden besteht darin, dass wir die Schlüssel profizieren können, um Konflikte zu vermeiden. In diesem Beispiel setzen wir das Präfix aller Schlüssel auf

mithilfe der sessionKey -Methode. new_user_wizard:

Jetzt, da diese Klasse festgelegt ist, lassen Sie uns sehen, wie wir im Controller damit interagieren:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

Wie wir im obigen Beispiel sehen, injizieren wir die AppSessionsUsersWizardSession -Klasse in unsere Controller -Methode. Laravel wird die Sitzungsinstanz automatisch für uns analysieren.

Dann können wir damit interagieren, wie wir es mit jeder anderen Klasse tun würden.

Dies kann sich zunächst wie überstrakt anfühlen und erfordert mehr Code-Wartung. Wenn das Projekt wächst, sind Typ -Eingabeaufforderungen, Rückgabetypen, Schlüsselgenerierungsmethoden und sogar Benennungsmethoden (die Ihre Operationen beschreibender werden) sehr nützlich.

Testsitzungen in Laravel


genau wie in jedem anderen Teil der Codebasis sollten Sie sicherstellen, dass Sie die Sitzungsdaten übernehmen, um sicherzustellen, dass die richtigen Felder gelesen und geschrieben werden.

Einer der großen Vorteile der Verwendung von Sitzungsklassen ist, dass Sie für jede Methode in der Klasse problemlos zentralisierte Tests für die Einheitstil schreiben können.

Zum Beispiel können wir einige Tests für die AppSessionsUsersWizardSession -Methode der getFormDataForStep -Klasse schreiben. Zur Erinnerung ist hier die Methode:

<code>$currentStep = session()->get(key: 'wizard:current_step');</code>

Wir können hier mehrere Szenarien testen:

  • Gibt das AppDataTransferObjectsWizardsUsersFormData -Objekt für den Schritt zurück.
  • Wenn der Schritt keine Formulardaten hat, geben Sie null zurück.

Unsere Testklasse kann so aussehen:

<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

In der obigen Testklasse haben wir zwei Tests, die die beiden zuvor erwähnten Fälle abdecken.

Diese Style -Tests sind ideal, um sicherzustellen, dass Ihre Sitzungsklasse korrekt konfiguriert ist, um Sitzungsdaten zu lesen und zu schreiben. Sie lassen Sie jedoch nicht unbedingt glauben, dass sie im Rest der Codebasis korrekt verwendet werden. Sie können beispielsweise getFormDataForStep(1) aufrufen, und Sie sollten getFormDataForStep(2) aufrufen.

Aus diesem Grund möchten Sie auch in Betracht ziehen, Sitzungsdaten in Ihren Funktionstests zu gründen (die, die Sie normalerweise für Ihren Controller schreiben).

Angenommen, Sie haben die folgende grundlegende Methode in Ihrem Controller, und es wird zum nächsten Schritt im Assistenten gehen:

<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

In der obigen Methode haben wir zuerst den aktuellen Schritt aus der Sitzung gelesen. Anschließend speichern wir die Formulardaten für den aktuellen Schritt in der Sitzung. Schließlich erhöhen wir den aktuellen Schritt und leiten zum nächsten Schritt im Assistenten um.

wir gehen davon aus, dass unsere AppHttpRequestsUsersWizardNextStepRequest -Klasse für die Validierung der Formulardaten verantwortlich ist und die toDto -Schelle zurückgibt, wenn wir die AppDataTransferObjectsWizardsUsersFormData -Methode aufrufen.

wir gehen auch davon aus, dass die nextStep Controller -Methode über eine Postanforderung an die /users/wizard/next-step Route (mit dem Namen users.wizard.next-step) zugegriffen werden kann.

Möglicherweise möchten wir den folgenden Test schreiben, um sicherzustellen, dass die Formulardaten in der Sitzung korrekt gespeichert sind:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

Im obigen Test verwenden wir einige Formulardaten, um eine Postanforderung an die /users/wizard/next-step -Route auszugeben. Sie können feststellen, dass wir withSession verwenden. Mit dieser Methode können wir die Sitzungsdaten so festlegen, dass wir behaupten können, dass sie korrekt gelesen werden.

Wir behaupten dann, dass der Benutzer zum nächsten Schritt im Assistenten umgeleitet wird und dass der aktuelle Schritt in der Sitzung auf 3 festgelegt ist. Wir behaupten auch, dass die Formulardaten für Schritt 2 in der Sitzung korrekt gespeichert sind.

Wie wir in unseren Tests gesehen haben, haben wir auch auf zwei Arten aus der Sitzung gelesen:

  • Verwenden Sie die Methode assertSessionHas, um zu überprüfen, ob die Sitzungsdaten korrekt festgelegt sind.
  • Verwenden Sie die Funktion session() Helfer, um Sitzungsdaten direkt zu lesen.

Beide Methoden funktionieren, sodass Sie entscheiden können, welche Sie bevorzugen. Ich habe beide Methoden im obigen Test verwendet, um Ihnen zu zeigen, dass Sie mehrere Optionen haben.

Schlussfolgerung


Ich hoffe, dieser Artikel hilft Ihnen, gut zu verstehen, welche Sitzungen sind und wie sie in Laravel arbeiten. Ich hoffe auch, dass sie Ihnen einige Ideen geben, wie Sie mit Sitzungsdaten mit klassenbasierten Methoden interagieren, um einige gemeinsame Fallstricke zu vermeiden.

Das obige ist der detaillierte Inhalt vonEin tiefes Eintauchen in Sessions in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn