I den här artikeln dyker vi djupt in i Laravel-ramverket för att förstå begreppet middleware. Den första halvan av artikeln börjar med en introduktion till middleware och vad den faktiskt används för.
När vi går vidare täcker vi hur du skapar anpassad middleware i en Laravel-applikation. Efter att du har skapat din anpassade middleware, undersöker vi vilka alternativ som finns tillgängliga för att registrera det med Laravel så att det faktiskt kan påkallas under begäran om processflöde.
Jag hoppas att du anser dig bekant med grundläggande Laravel-koncept och Artisan-kommandoradsverktyget för att generera byggnadskoden. En fungerande installation av den senaste Laravel-applikationen tillåter självklart att du kör genast de exempel som anges i den här artikeln.
Vi kan tänka på middleware som en mekanism som gör att du kan koppla in i det typiska förfrågningsbehandlingsflödet av en Laravel-applikation. En typisk Laravel-ruttbearbetning går igenom vissa stadier av begäranbehandling, och middleware är ett av de lager som en applikation måste passera igenom.
Så vad är exakt vad som hänger i Laravel-förfrågan för behandling av flöden? Tänk på något som kräver en körning i början av uppstart av en applikation. Det är till exempel nödvändigt att autentisera användare i de tidiga stadierna för att bestämma om de får få tillgång till den aktuella rutten.
Några saker jag kan tänka på som du kan uppnå genom middleware är:
I själva verket skickar standard Laravel-ansökan redan ett par viktiga delar av middleware med den. Det finns till exempel mellanprogram som kontrollerar om webbplatsen är i underhållsläge. Å andra sidan finns middleware för att sanera inmatningsförfrågningsparametrarna. Som jag nämnde tidigare uppnås användarautentiseringen av middleware själv.
Jag hoppas att förklaringen hittills hjälper dig att känna dig mer säker på termen middleware. Om du fortfarande är förvirrad, oroa dig inte om det eftersom vi ska bygga en del anpassad middleware från nästa avsnitt och framåt som ska hjälpa dig att förstå exakt hur middleware kan användas i den verkliga världen.
I det här avsnittet skapar vi vår anpassade middleware. Men vad exakt är vår anpassade middleware kommer att åstadkomma?
Nyligen kom jag över ett anpassat krav från min klient att om användare skulle komma åt webbplatsen från vilken mobil enhet som helst, borde de omdirigeras till motsvarande underdomänwebbadress med alla parametrar för frågesträngen intakta. Jag tror att det här är det perfekta användningsfallet för att visa hur Laravel middleware kan användas i det här scenariot.
Anledningen till att vi skulle vilja använda middleware i detta fall är behovet av att haka i ansökans flöde av programmet. I vår anpassade middleware inspekterar vi användaragenten och användarna omdirigeras till motsvarande mobiladress om de använder en mobil enhet.
Efter att ha diskuterat all den teorin, låt oss hoppa in i den faktiska utvecklingen, och det är det bästa sättet att förstå ett nytt koncept, är det inte?
Som en Laravel-utvecklare är det Artisan-verktyget som du kommer att sluta använda mest av tiden för att skapa grundläggande mallkod om du vill skapa någon anpassad funktionalitet. Låt oss använda den för att skapa en grundläggande mallkod för vår anpassade middleware.
Gå över till kommandoraden och gå dokumentets rot av ditt projekt. Kör följande kommando för att skapa den anpassade middleware-mallen MobileRedirect
.
php artisan make: middleware MobileRedirect
Och det borde skapa en fil app / HTTP / Middleware / MobileRedirect.php
med följande kod.
Ofta än inte kommer du att märka genomförandet av
hantera
metod som fungerar som ryggraden i middleware och den primära logiken för middleware du vill implementera ska gå här.Låt mig ta tillfället i akt för att presentera de typer av middleware som Laravel kommer med. I huvudsak är de två typerna - före middleware och efter middleware.
Som namnet antyder, är den tidigare middleware något som körs innan begäran faktiskt hanteras och svaret är byggt. Å andra sidan körs efter-middleware efter att begäran har hanterats av applikationen och svaret är redan byggt vid denna tidpunkt.
I vårt fall måste vi omdirigera användaren innan förfrågan hanteras och kommer därför att utvecklas som en tidigare middleware.
Gå vidare och ändra filen
app / HTTP / Middleware / MobileRedirect.php
med följande innehåll.mobil == "1") return omdirigering ('mobil-site-url-går-här'); returnera $ nästa ($ request);För enkelhetens skull kontrollerar vi bara existensen av
mobil
frågesträngsparametern, och om den är inställd påSANN
, användaren omdirigeras till den motsvarande mobilwebbadressens URL. Självklart vill du använda användaragentdetekteringsbiblioteket om du vill detektera det i realtid.Du skulle också vilja ersätta
mobil-site-url-går-här
rutt med rätt väg eller webbadress eftersom det bara är en platshållare för demonstrationsändamål.Efter vår anpassade logik är det ett samtal till
$ Nästa ($ begäran)
som gör att begäran kan behandlas vidare i ansökningskedjan. Det viktiga att notera i vårt fall är att vi har placerat mobildetekteringslogiken före$ Nästa ($ begäran)
ringa, vilket gör att det är en före middleware.Och med det är vår anpassade middleware nästan redo att bli testad. För tillfället finns det inget sätt Laravel vet om middleware. För att få det att hända måste du registrera din middleware med Laravel-ansökan, och det är precis ämnet för nästa avsnitt.
Innan jag går in i nästa avsnitt vill jag visa hur den eftermiddagen ser ut, bara om någon där ute är nyfiken på det.
Som du redan skulle ha märkt görs den anpassade logiken för middleware efter att begäran har behandlats av Laravel-programmet. Vid denna tid har du tillgång till
$ svar
objekt också, som gör att du kan manipulera vissa aspekter av det om du vill.Så det var historien om efter middleware.
Vår Custom Middleware in Action
I det här avsnittet beskrivs processen för att registrera middleware med Laravel-applikationen så att den faktiskt kan åberopas under processbehandlingsflödet.
Gå vidare och öppna filen
app / HTTP / Kernel.php
och leta efter följande utdrag./ ** * Programmets globala HTTP middleware stack. * * Dessa middleware körs under varje förfrågan till din ansökan. * * @var array * / protected $ middleware = [\ Illuminate \ Foundation \ Http \ Middleware \ CheckForMaintenanceMode :: klass, \ Illuminate \ Foundation \ Http \ Middleware \ ValidatePostSize :: klass, \ App \ Http \ Middleware \ TrimStrings :: klass, \ Illuminate \ Foundation \ Http \ Middleware \ ConvertEmptyStringsToNull :: klass,];Som du kan se, är
$ middleware
innehåller en mängd mellanprogram som följer med standardinstallationen av Laravel. Den middleware som listas här kommer att utföras vid varje Laravel-förfrågan, och det är därför en idealisk kandidat att placera vår egen anpassade middleware.Fortsätt och inkludera vår anpassade middleware som visas i följande kod.
skyddad $ middleware = [\ Illuminate \ Foundation \ Http \ Middleware \ CheckForMaintenanceMode :: klass, \ Illuminate \ Foundation \ Http \ Middleware \ ValidatePostSize :: klass, \ App \ Http \ Middleware \ TrimStrings :: klass, \ Illuminate \ Foundation \ Http \ Middleware \ ConvertEmptyStringsToNull :: klass, \ App \ Http \ Middleware \ MobileRedirect :: klass,];Nu försöker du komma åt någon av dina Laravel-rutter med frågesträngen
mobil = 1
, och det borde utlösa vår middleware-kod!Så så ska du registrera din middleware som måste köras på varje förfrågan. Men ibland vill du bara köra din middleware för specifika rutter. Låt oss se hur du uppnår det genom att använda
$ routeMiddleware
.I samband med vårt nuvarande exempel, låt oss anta att användarna omdirigeras till en mobil webbplats om de kommer åt någon specifik rutt på din webbplats. I det här scenariot vill du inte inkludera din middleware i
$ middleware
lista.I stället vill du bifoga middleware direkt till rutdefinitionen, som visas nedan.
Rutt :: få ('/ hallo world', 'HelloWorldController @ index') -> middleware (\ App \ Http \ Middleware \ MobileRedirect :: klass);Faktum är att vi kunde gå ett steg längre och skapa ett alias för middleware så att du inte behöver använda inline klassnamn.
Öppna filen
app / HTTP / Kernel.php
och leta efter$ routeMiddleware
som håller mappings av alias till middleware. Låt oss inkludera vår post i den listan, som visas i följande kod.skyddad $ routeMiddleware = ['auth' => \ Illuminate \ Auth \ Middleware \ Godkänn :: klass, 'auth.basic' => \ Illuminate \ Auth \ Middleware \ AuthenticateWithBasicAuth :: klass, 'bindningar' => \ Illuminate \ Routing \ Middleware \ SubstituteBindings :: class, 'can' => \ Illuminate \ Auth \ Middleware \ Godkänn :: klass, 'gäst' => \ App \ Http \ Middleware \ RedirectIfAuthenticated :: klass, 'gaspump' => \ Illuminate \ Routing \ Middleware \ ThrottleRequests :: klass, 'mobile.redirect' => \ App \ Http \ Middleware \ MobileRedirect :: klass];Och den ändrade rutdefinitionen ser ut så här.
Rutt :: få ('/ hallo world', 'HelloWorldController @ index') -> middleware ('mobile.redirect');Och det är historien om att registrera middleware med Laravel-applikationen. Det var ganska enkelt, var det inte?
Faktum är att vi har nått slutet av den här artikeln, och jag hoppas att du noggrant haft det.
Slutsats
Att utforska det arkitektoniska konceptet i något ramverk är alltid spännande saker, och det var vad vi gjorde i den här artikeln när vi undersökte middleware i Laravel-ramverket.
Med en grundläggande introduktion till middleware skiftade vi uppmärksamheten på ämnet att skapa anpassad middleware i en Laravel-applikation. Och det var den sista halvan av artikeln som diskuterade hur man registrerade din anpassade middleware med Laravel, och det var också möjlighet att utforska olika sätt att fästa din middleware.
Förhoppningsvis var resan fruktbar och artikeln har hjälpt dig att berika din kunskap. Om du vill att jag ska komma med specifika ämnen i de kommande artiklarna kan du alltid släppa mig en rad om det.
Det är det för idag, och tveka inte att skjuta dina frågor, om några, med hjälp av flödet nedan!