PHP-Code:
/**
* Register services.
*
* @return void
* @throws ReflectionException
*/
public function register()
{
$modelClasses = glob('./../app/*.php');
foreach ($modelClasses as $modelClass) {
if (
strpos($modelClass, 'Interface') === false &&
strpos($modelClass, 'Trait') === false
) {
foreach (['php', '.', '/', 'app'] as $pattern) {
$modelClass = str_replace($pattern, '', $modelClass);
}
$reflectionClass = new ReflectionClass('App\\' . $modelClass);
$docBlock = $reflectionClass->getDocComment();
if (!empty($docBlock) && strpos($docBlock, '@Repository') !== false) {
$repositoryName = explode('"', $docBlock)[1];
$this->app->singleton(
'App\\Contracts\\Repositories\\' . $repositoryName . 'Interface',
'App\\Repositories\\Eloquent\\' . $repositoryName
);
}
}
}
}
Es werden schon einige Repositories werden und ich bin zu faul bzw. finde es umständlich, jedes Repository mit Interface und Klasse im Service Provider zu registrieren. Ich halte mich streng an meine Konventionen und sehe momentan kein Risiko, vom oben erkennbaren Muster abzuweichen.
Ich weiß, dass Laravel das Active Record Pattern nutzt und es daher evtl. unüblich ist, Repositories zu nutzen. Ich weiß aber aus anderen Projekten auch, dass es schnell passieren kann, dass die gleichen Abfragen redundant im Code oder gar in Templates vorliegen und möchte diese hier in Repositories kapseln. Dazu wird das Projekt irgendwann zwei verschiedene Datenhaltungen haben.
Kann man das so wie oben machen?
Mit Facaden und Real Time Facaden hat man keine Autovervollständigung in PhpStorm und zudem fühlt es sich unnatürlich an, Logikklassen für Datenzugriffe "einfach so" in den Code zu schmeißen, weswegen ich sie lieber (in die Controller und die anderen Logikklassen) injizieren möchte.
Vielen Dank für jede Antwort und viele Grüße.
Kommentar