Uygulama bileşenlerini birer servis gibi düşünüp uygulamayı servislere böleceksiniz. Servis şişerse onu da bileşenlere ya da başka servislere ayıracaksınız. Bunların her biri ayrı birer repo olacak. laravel/laravel ve laravel/framework ya da symfony/symfony ve symfony/website-skeleton gibi düşünün. laravel/framework reposu Laravel'in bileşenlerini içerir, Laravel sadece bunların bir araya getirilip, birbirlerine bağlanarak oluşturulduğu bir iskelet.
Bir controller yöntemi içerisinde mantığı kurmayacaksınız. Mantığı parçalara bölüp onu yapan servisler oluşturacaksınız, o servisleri yönteme enjekte edip kullanacaksınız. Controller'lar da servislere göre gruplanacak. Bu sırada Laravel'in service container özelliklerini kullanıp enjekte edilen servisleri tak-çıkar parçalar gibi değiştirilebilir hale getireceksiniz. Elinizde servis ve bileşenlerden oluşan bir repo oluşmuş olacak, her biri bir iş yapan ama bir bütün içerisinde yer almayınca çalışmayan parçalar şeklinde. Uygulamanız ise bunları kullanacak olan basit bir iskelet olacak ve genel amacınızı uygun bir temel uygulama oluşturacaksınız.
Müşteri özel bir şey mi istedi, hangi bileşende değişiklik gerekiyor, atıyorum excel-importer. Orada farklı bir mantık mı istiyor, ona ayrı bir importer yazacaksınız, başkaları tarafından da kullanılabilecek. Müşteriye çok özel çok spesifik bir şey ise, o firmadan başkası kullansmayacaksa o firmaya özel importer yazacaksınız. Bunun için de her bir müşteriye benzersiz bir takma isim belirleyin. Özellikle formatı dosya isimlerinde kullanmaya uygun bir takma isim olsun. Örneğin Laravel Türkiye Ltd. Şti. ise laravel-turkiye olsun. Bunu bir çok yerde kullanacaksınız. Mesela kabaca:
our-big-project/excel-importer:
src/
Importer.php
ImporterInterface.php
ImporterServiceProvider.php
ImporterConcerns.php
Importers/
DefaultImporter.php
Custom/
ServiceAImporter.php
ServiceBImporter.php
XYZBankImporter.php
Dedicated/
LaravelTurkiye/
Importer.php
ImporterServiceProvider.php
Custom/
ServiceAImporter.php
$companyAlias = 'laravel-turkiye';
$importerProvider = sprintf("\\OurBigProject\\ExcelImporter\\Importers\\Dedicated\\%s\\ImporterServiceProvider::class", $companyAlias);
$this->app->registerDeferredProvider($importerProvider);
// ...
$this->app->bind('laravel-turkiye.importer', function($app) {
return new \OurBigProject\ExcelImporter\Importers\Dedicated\LaravelTurkiye\Importer;
});
$this->app->alias('laravel-turkiye.importer', \OurBigProject\ExcelImporter\Importers\Dedicated\LaravelTurkiye\Importer::class);
$companyAlias = 'laravel-turkiye';
$importer = resolve($companyAlias.'.importer');
$importer->setAdapter(...
$importer->setConcern(...
$importer->setFile(...
...
Yani klasik tekil MVC yapısının yerine Hexagonal Architecture bir üs oluşturmanız lazım. Bunu araştırın.