Five Hidden Gems of Laravel

Veel ontwikkelaars die Laravel gebruiken, zijn waarschijnlijk slechts krasjes op de oppervlakte van wat het framework te bieden heeft. Hoewel de documentatie de meest gebruikelijke gebruikscasussen en de voor de hand liggende functies omvat, heeft deze niet alles te bieden. 

Begrijp me niet verkeerd, de documentatie is goed, het is gewoon dat je zoveel kunt doen, het is moeilijk om te documenteren alles. Daarom gaan we enkele verborgen juweeltjes in Laravel bekijken.

Cascading Views

Beschikbaar sinds: v4.0.0
gedocumenteerd: Nee

Weergaven kunnen bijna hetzelfde lopen als configuratiebestanden. Cascading views zijn uitermate handig bij het ontwikkelen van een uitbreidbaar themasysteem. Beschouw de volgende mapstructuur.

/ app / views / blog /index.blade.php / themes / default / views / blog /index.blade.php /theme.blade.php

Het idee is dat wanneer we return View :: make ('theme :: blog.index'); het zal eerst in de kijken themes / default / uitzicht map en vervolgens, als het de weergave niet kan vinden, terugvallen op app / views.

Om dit te doen gebruiken we Bekijk :: addNamespace om onze eigen naamruimte te registreren bij de twee locaties.

View :: addNamespace ('theme', [base_path (). '/ Themes / default / views', app_path (). '/ Views']);

collecties

Beschikbaar sinds: v4.0.0
gedocumenteerd: Gedeeltelijk

Collecties zijn een uitstekende manier om arrays te gebruiken en te beheren. Collecties hebben verschillende handige methoden en implementeren een aantal nuttige interfaces zoals ArrayableInterface, IteratorAggregate, en JsonableInterface.

Laten we zeggen dat we een kleine bloggengine bouwen die platte bestanden gebruikt voor opslag. We willen bewerkingen kunnen uitvoeren zoals sorteren, filteren en pagineren.

Het implementeren van de bloggengine valt buiten het bestek van dit artikel, maar laten we ons voorstellen dat we een array hebben, $ artikelen, en elk lid van de array is een instantie van een Artikel klasse. Alles wat we dan moeten doen is een nieuw exemplaar krijgen van Verzameling en geef het onze reeks artikelen.

$ articles = nieuwe Illuminate \ Support \ Collection ($ arrayOfArticles);

sorteer-

Met behulp van de collectie kunnen we onze artikelen sorteren. Laten we onze artikelen sorteren en eerst de meest recent bijgewerkte artikelen weergeven. Laten we ons in het belang van dit artikel voorstellen dat bij het laden van de artikelen uit het bestandssysteem de updatedAt eigenschap tot de laatst gewijzigde tijd van het bestand.

$ articles-> sortByDesc (function ($ article) return $ article-> updatedAt;);

De sorteer op en sortByDesc methoden accepteren een callback, deze callback moet een waarde retourneren die kan worden gebruikt voor het sorteren van de verzameling. In ons geval kunnen we de artikelen de laatst aangepaste tijd retourneren en de verzameling kan daarop gebaseerd sorteren.

filtering

Net als bij sorteren kunnen we de verzameling ook gebruiken om onze artikelen te filteren als a WAAR clausule in MySQL. Laten we onze artikelen filteren op basis van een zoekopdracht die mogelijk is uitgevoerd.

filter (functie ($ artikel) gebruik ($ searchQuery) return preg_match (sprintf ('/% s / m', $ searchQuery), $ article-> body););

De filter methode retourneert eigenlijk een nieuw exemplaar van Verlichten \ Support \ Collection dus we moeten het toewijzen aan de $ resultaten variabel. Deze nieuwe collectie bevat alleen de artikelen waarin 'Laravel rocks!' In het lichaam wordt vermeld.

Paginering

Met behulp van de verzameling kunnen we onze artikelen pagineren, zodat we niet al te veel artikelen op één pagina verschijnen.

$ perPage = 1; $ page = Input :: get ('page', 1); if ($ page> ($ articles-> count () / $ perPage)) $ page = 1;  $ pageOffset = ($ page * $ perPage) - $ perPage; $ results = $ articles-> slice ($ pageOffset, $ perPage);

De ... gebruiken plak methode, we extraheren een deel van de artikelen in de verzameling en wijzen het toe aan de $ resultaten veranderlijk. 

Dit voorbeeld kan dan nog verder worden genomen door een nieuw exemplaar van Laravel's te maken paginator klasse. Op die manier kan het alle paginanummers en links voor u genereren.

Er is meer!

We zouden een willekeurig artikel kunnen krijgen:

$ article = $ articles-> random ();

We kunnen ook onze verzameling artikelen herhalen als ware het een gewone reeks. Dit is allemaal te danken aan de IteratorAggregate en ArrayIterator interfaces.

foreach ($ artikelen als $ artikel) echo $ article-> body; 

En we kunnen onze artikelen zelfs transformeren naar een gewone array of naar de JSON-representatie.

$ array = $ articles-> toArray (); $ json = $ articles-> toJson ();

Een van de coolste methoden is waarschijnlijk GroupBy, waarmee we artikelen kunnen groeperen op basis van een specifieke sleutel. Stel je voor dat elk artikel wat metagegevens had bovenaan, dat werd geparseerd en ontdaan van de inhoud van het artikel.

Hoewel het ontleden van deze metadata buiten het bestek van dit artikel valt, nemen we aan dat het is geparseerd en een eigenschap is op de Artikel aanleg. Je zou dan kunnen gebruiken GroupBy om de artikelen te groeperen op basis van de categorie waarin ze zijn geplaatst.

$ results = $ articles-> groupBy ('category'); 

Alle artikelen met dezelfde categorie worden gegroepeerd. Je zou dan de artikelen voor een specifieke categorie kunnen krijgen.

foreach ($ results-> get ('tutorial') als $ artikel) echo $ article-> body; 

Collecties zijn een van de best verborgen juweeltjes die Laravel te bieden heeft.

Reguliere expressiefilters

Beschikbaar sinds: v4.1.19
gedocumenteerd: Nee

Het filteren van routes in Laravel is een veel voorkomende taak die velen van ons in al onze projecten doen. Met een filter kunt u taken uitvoeren, zoals gebruikersauthenticatie of snelheidsbeperking, vóór of nadat een route is afgevuurd. We maken filters met behulp van Route :: filter en kan ze toepassen op individuele routes, een routegroep of door gebruik te maken van Route :: wanneer en toepassen op een aangepast patroon.

Route :: filter ('restricted', functie ($ route, $ request, $ group) // Beperk gebruikerstoegang op basis van de waarde van $ group); Route :: when ('admin / *', 'restricted: admin'); 

In dit voorbeeld maken we een beperkt filter dat een enkele parameter verwacht, $ groep. De $ route en $ verzoek parameters worden altijd gegeven aan een vóór filter.

Maar wat als we meer flexibiliteit wilden? Laten we zeggen dat we het filter wilden toepassen op alle beheerder routes behalve voor admin / login. We kunnen een routegroep gebruiken en de betreffende route eenvoudig buiten de groep verplaatsen. Of we kunnen gebruiken Route :: whenRegex en schrijf onze eigen reguliere expressie.

Route :: whenRegex ('/ ^ admin (\ / (?! Login) \ S +)? $ /', 'Restricted: admin');

Deze reguliere expressie zorgt er eenvoudigweg voor dat deze alleen wordt toegepast op routes die beginnen met beheerder en worden niet gevolgd door /Log in, maar kan worden gevolgd door iets anders. Uitstekend. We hebben nu onze beperkt: admin filter toegepast op alle routes behalve onze admin / login route.

De berichtenzak

Beschikbaar sinds: v4.0.0
gedocumenteerd: Gedeeltelijk

Je hebt het ongetwijfeld gebruikt Verlichten \ Support \ MessageBag voor een tijdje nu zonder het zelfs te beseffen. De grootste rol MessageBag plays bevat al uw validatiefouten bij het gebruik van Laravel's ingebouwde validator.

Een $ fouten variabele is beschikbaar in elke weergave die een leeg venster bevat MessageBag instantie of het exemplaar dat u naar de sessie hebt geflasht Redirect :: tot ( '/') -> withErrors ($ validator);

Er is een goede kans dat veel van jullie misschien zoiets doen in jouw formulieren wanneer een foutmelding verschijnt onder een bepaalde invoer.

Formulier: tekst ('gebruikersnaam', null) @if ($ errors-> has ('gebruikersnaam')) 
$ errors-> first ('gebruikersnaam')>
; @stop als

Je kunt dat feitelijk verwijderen als verklaring volledig en gebruik de tweede parameter van de eerste methode om het bericht in de div.


 Formulier: tekst ('gebruikersnaam', null) $ fouten '-> eerst (' gebruikersnaam ','
:bericht
')

Veel, veel, veel leuker!

Vloeiend

Beschikbaar sinds: v3.0.0
gedocumenteerd: Gedeeltelijk

De Vloeiend class bestaat al heel lang en wordt feitelijk binnen het framework zelf gebruikt bij het maken van migraties met de schemabuilder. Tussen Laravel 3 en Laravel 4 is de klasse zelf nauwelijks veranderd, de enige grote verschillen zijn nog een paar interfaces.

Om de te gebruiken Vloeiend klasse alles wat je hoeft te doen is een instantie te krijgen en als je weg bent.

$ user = new Illuminate \ Support \ Fluent; $ Gebruiksvriendelijkheid> naam ( 'Jason') -> land ( 'Australia') -> abonnee ();

De instantie heeft nu 3 attributen gedefinieerd, naam met een waarde van Jason, land met een waarde van Australië, en abonnee met een boolean waar waarde.

Voorafgaand aan Laravel 4.1 kon je de attributen van het exemplaar alleen echt instellen en krijgen. Sinds Laravel 4.1 kunt u de toArray en toJSON methoden om respectievelijk de array met kenmerken en de JSON-weergave te verkrijgen. 

Vanaf Laravel 4.2 implementeert de klasse ook de JsonSerializable interface wat betekent dat je de instantie rechtstreeks kunt doorgeven json_encode.

Er is zelfs meer!

We hebben verschillende bruikbare edelstenen van het Laravel-raamwerk bekeken. Maar zoals je al geraden hebt, zit er nog meer in het raamwerk. 

De beste manier om erachter te komen wat Laravel nog meer te bieden heeft, is door in de bron te graven. Het is niet zo eng als je zou denken en je zult veel leren over het kader waar je aan werkt.

Als je extra edelstenen hebt die je hebt gevonden, aarzel dan niet om ze in de reacties te delen!