Skip to content

HTTP Session

Översikt

Ibland vill man lagra information om en användare över flera anrop. Genom Laravel har vi ett enkelt sätt att lägga till och använda den här datan.

Ett exempel är att visa en alert banner efter en redirect från ett inskickat formulär. Tidigare har detta löst med konstiga GET-parametrar, vilket oftast inte rensas upp efteråt, vilket betyder att bannern finns kvar om man laddar om sidan.

Varför inte vanliga PHP sessions?

PHP har inbyggt stöd för sessions och kan hanteras genom $_SESSION variabeln och de olika session_ funktionerna, men vi använder inte det.

Laravel och WordPress använder inte PHP sessions av diverse anledningar, en av dem är trådsäkerhetsproblem. Laravel bestämde sig att implementera ett eget, mer flexibelt system för det, medan WordPress inte har någon konkret motsvarighet.

Kom igång

Om du kör version 0.17.0 av Horizon behöver du inte sätta upp något manuellt.

Om du kör en tidigare version behöver du först uppgradera Dusk till version 2.5.0 eller senare.

shell
composer update nobox/dusk

Efter det behöver du lägga till SESSION_DOMAIN i din .env fil:

dotenv
SESSION_DOMAIN="example.test"

SESSION_DOMAIN bör stämma överens med domänen som används i WP_HOME. Förslagsvis kan du bryta ut domänen till en egen variabel och använda den i de andra variablerna:

dotenv
DOMAIN="example.test"

WP_HOME="http://${DOMAIN}"

SESSION_DOMAIN="${DOMAIN}"

På detta vis behöver du endast uppdatera DOMAIN variabeln.

Konfiguration

Konfigurationen sker genom filen config/session.php. Ifall du inte har en sådan fil kommer Dusks inbyggda användas. Konfigurationsfilen kan hämtas på samma sätt som de andra konfigurationsfilerna:

shell
wp dusk vendor:publish --tag=dusk

Notera

Detta kommer kopiera över samtliga konfigurationer till temamappen. Du kan ta bort de andra som kopierades om du inte vill ha kvar dem, men det gör inget att låta dem vara.

Laravels session stöd stödjer flera backends, som standard används file drivern, som lägger sessions i temats storage/framework/sessions mapp. Denna mapp skapas om den inte redan finns, men från och med Horizon 0.17.0 följer den med som standard.

Tillsammans med detta används en kaka som heter horizon_session som används för att identifera sessionen. Om du önskar kan du byta namn på den genom att sätta variabeln SESSION_COOKIE i din .env fil:

dotenv
SESSION_COOKIE=custom_session

Andra backends som är inbyggda i Laravel är:

  • database - sessioner sparas i databasen (behöver extra arbete för att fungera med WordPress)
  • cookie - sessioner sparas som en krypterad cookie
  • memcached / redis - sessioner sparas i dessa cacheminnen
  • dynamodb - sessioner sparas i AWS DynamoDB
  • array - sessioner lagras i en PHP array och kommer inte sparas utöver det (används främst i tester)

Det går även att utöka med egna backends om så önskas. För mer information om det, se Laravels dokumentation.

Användning

För att arbeta med sessions finns helperfunktionen session.

Sessiondata består av (utöver extra metadata) nyckel-värde par, ex. i PHP array form:

php
[
    'name' => 'Benjamin',
    'counter' => 1,
]

Hämta data

För att hämta data kan du skicka med namnet på nyckeln du vill hämta som en parameter till session:

php
// Hämta ett värde
$name = session('name');

// Ställ in ett standardvärde
$name = session('name', 'Benjamin');

Standardvärdet kan också vara en funktion. Denna funktion kommer enbart köras om värdet inte finns:

php
$name = session('name', function () {
    return 'Benjamin';
});

Du kan också använda metoden get på samma sätt:

php
// Hämta ett värde
$name = session()->get('name');

// Ställ in ett standardvärde
$name = session()->get('name', 'Benjamin');
// eller
$name = session()->get('name', function () {
    return 'Benjamin';
});

Det går att hämta och samtidigt ta bort en nyckel med metoden pull.

php
$name = session()->pull('name');
// Det går även här att definiera ett standardvärde
$name = session()->pull('name', 'Benjamin');

Om du vill hämta all data som är lagrad kan du använda metoden all:

php
$data = session()->all();

För att se om en nyckel finns lagrad kan du använda metoderna has eller exists. has ignorerar null värden och returnerar således false om nyckeln finns men värdet är null, medan exists returnerar true om nyckeln finns oavsett om värdet är null eller ej.

php
if (session()->has('status')) {
    //
}

if (session()->exists('status')) {
    //
}

Om du vill göra motsatsen, dvs. se om ett värde saknas, kan du använda metoden missing:

php
if (session()->missing('counter')) {
    //
}

Lagra data

För att lagra data kan du skicka in en array som består av nyckel-värde par som parameter till session:

php
session(['name' => 'Benjamin']);

Det går även att använda metoden put på samma vis:

php
session()->put('name', 'Benjamin');

Om du vill lägga till objekt i en nyckel vars värde är en array kan du använda metoden push:

php
// Med `teams` i sessionen
session(['teams' => []]);
// ...
session()->push('teams', 'developers');

Om nyckelns värde är ett heltal kan du öka och minska värdet med metoderna increment resp. decrement:

php
// Öka värdet med 1
session()->increment('counter');
// Ändra hur mycket värdet ska ökas med
session()->increment('counter', 2);

// Minska värdet med 1
session()->decrement('counter');
// Ändra hur mycket värdet ska minskas med
session()->decrement('counter', 2);

Flasha data

Ibland vill man bara lagra information som ska användas i det nästkommande anropet, ex. en redirect. Det man man göra med så kallad "flash" data. Den kommer automatiskt att tas bort efter att nästa anrop har gjorts. Exempel på data som kan lagras på detta vis är status meddelanden efter ett anrop.

För att lagra flash-data använder du metoden flash:

php
session()->flash('status', __('Tack för förfrågan!', 'horizon'));
// eller
session()->flash('success', false);
// etc.

Om du vill återanvända flash-data för flera anrop kan man använda metoden reflash.

php
session()->reflash();

Notera

Du kan inte bestämma vilka flash nycklar som ska skickas på nytt med reflash. Om du vill bestämma vilka nycklar som ska skickas igen kan du använda metoden keep.

php
session()->keep(['name', 'counter']);

Om du vill flasha data för det nuvarande anropet, ex. i ett filter som körs innan output, kan du istället använda metoden now:

php
session()->now('status', __('Mejlet har skickats.', 'horizon'));

Ta bort data

Om du vill ta bort data som du har lagrat kan du använda metoderna forget och flush.

forget tar bort en eller flera nycklar, medan flush rensar all data.

php
// Ta bort enskild nyckel
session()->forget('counter');
// eller flera nycklar
session()->forget(['counter', 'name']);

// Rensa allt
session()->flush();