Laravel OOP

1 maand geleden • 4 minuten lezen

Naargelang ik uitgebreider aan de slag ben gegaan terwijl de complexiteit groeit, ben ik dieper in Laravel OOP beginnen graven, zo heb ik in de afgelopen weken weer super veel bijgeleerd, waarvan ik in deze blog een aantal hoogtepunten beschrijf.

De codevoorbeelden die ik in dit artikel toon zijn aangepast met placeholder teksten en variabelen.

Image interventions

Nu ik volledig met disks en file storage heb leren werken in Laravel werd het tijd om mijn file APIs nog een stuk bij te sturen. Zo mocht ik via Composer-packages uitzoeken hoe ik het beste images kon comprimeren en resizen naar verschillende formaten!

Als tip kreeg ik van mijn stagementor om met de Intervention Image package te werken, waar de collega’s van het bedrijf al wat ervaring met hadden.

Form Request extend

Om autorisaties bij de API services automatisch te autoriseren heb ik mijn form request classes uit de eerste week nog verder uitgebreid. Hiervoor bedacht ik een systeem, gebaseerd uit onze lessen OOP, om de Laravel Form Request Class te extenden.

class Foo extends ApiRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return parent::authorize();
    }

Zo kon ik een API autorisatie systeem schrijven met een unieke hash per user, die dan via overerving uit de parent class steeds direct hergebruikt kan worden.

Model validatie

Om echte applicaties correct te valideren zijn standaard validaties meestal niet genoeg. Als we relationele modellen willen creĆ«ren, moeten we dus ook kijken of gelinkte items bijvoorbeeld in de eerste plaats bestaan! Hiervoor heb ik leren werken met een aantal – voor mij nieuwe – Laravel model validators.

Om te controleren of een e-mailadres uniek is, kan je bijvoorbeeld de unique regel gebruiken:

 'email' => ['required', 'string', 'email', 'max:255', "unique:users,email,$userId"] 

Met deze regel kan je nagaan of er een gebruiker met het opgegeven e-mailadres bestaat. Niet onbelangrijk is wel dat je de huidige gebruiker moet meegeven – want deze moet natuurlijk zijn eigen e-mailadres steeds kunnen blijven gebruiken!

Eloquent advanced

Voor het verwerken van live grafieken en statistieken moest ik nog een aantal zaken uitgebreid researchen voor MySQL en de uiteindelijke vertaling naar Eloquent.

Om bijvoorbeeld een grafiek te tekenen over gewichten moest ik ranges gaan selecteren uit de database gelijkaardig zoals bij gebruikersonderzoek. Door naar verschillende methodes te zoeken ben ik zo uiteindelijk bij cases syntax terecht gekomen via de MySQL-documentatie.

SELECT integer_group, COUNT(*) AS total 
 FROM (SELECT
       CASE WHEN integer BETWEEN 0 AND 49 THEN '1|0 to 49'
       WHEN integer BETWEEN 50 AND 99 THEN '2|50 to 99'
       WHEN integer BETWEEN 100 AND 249 THEN '3|100 to 249'
       WHEN integer BETWEEN 249 AND 499 THEN '4|249 to 499'
       WHEN integer BETWEEN 500 AND 749 THEN '5|500 to 749'
       WHEN integer BETWEEN 750 AND 999 THEN '6|750 to 999'
       WHEN integer >= 1000 THEN '7|1000 +' END AS integer_group
       FROM foos) foos
 GROUP BY integer_group
 ORDER BY integer_group ASC

Nadat ik deze logica vrij snel onder de knie had, kwam het moeilijkste en leukste deel: de vertaling maken naar Eloquent! Om deze syntax en methode juist te krijgen heb ik toch nog goed moeten zoeken, waarvoor ik op de hulp kon rekenen van de vaste developers bij mijn stagebedrijf.

public static function loremStat($perPage = 15) {

return self::join('foo as f', 'foo.foo_id', '=', 'bars.id')
->select('foo.*', \DB::raw('SUM(f.qty) As total_qty'))
->where('f.boolean', 1)
->groupBy('bars.id')
->orderBy('total_qty', 'DESC')
->paginate($perPage);

}

Wordt vervolgd!

Mijn stage blijft steeds interessanter en uitdagender worden en ik ben super benieuwd hoe het project verder zal evalueren. In de komende weken zal ik ook kijken naar de front-end van de applicatie, waarvoor ik me zal verdiepen in VueJS en React!