Hiya,
Nice dat je wilt leren :-). Als je wat feedback wilt; wellicht kan je hier wat mee.
Composer psr-4;
Je gebruikt composer maar niet de Autoloading functie ervan. Je registreert nu je eigen autoloading functie. Als je iets van standarisatie in je code wilt voegen (psr-4 inclusief dus namespaces) dan raad ik je aan de autoloading functie te gebruiken.
https://getcomposer.org/doc/01-basic-usage.md#autoloading
Controllers;
In je controllers zie ik eigenlijk constant terug dat je de zelfde models in laad, wellicht met wat logica verplaatsen naar je base class? Of in je middelware afvangen? Voelt op één of andere manier niet geheel lekker om je __construct in je controller zelf aan de te roepen :-).
Hierdoor heb je ook kans dat je zaken in base controller wordt overschreven. Ik zou zelf iets van een setup() functie o.i.d. creeren welke wordt aangeroepen in plaats van de __construct functie.
Type hinting
Soms gebruik je type hinting (executables) en soms niet (controllers) pick one, doe het wel of doet het niet (DOE HET WEL! :-)). En als je dan toch bezig met ook gelijk type hinting voor je return meepakken:
Zelfde programmeren
Het zelfde programmeren en uniform tabs etc gebruiken is lastig, wellicht een tool als StyleCI? Trekt in één keer je code recht naar een standaard waardoor je code ook een stuk cleaner en overzichtelijker lijkt :-).
Er zullen vast nog meer tips zijn :-); maar keep up the good work; indereen begint ergens.