Laravel, modern PHP framework'lerinden biri olarak, uygulamaları modüler bir yapıda geliştirmek için güçlü bir esneklik sunar. Özellikle büyük ölçekli projelerde, modüler mimari kullanarak uygulamanızı daha okunabilir, sürdürülebilir ve kolay genişletilebilir hale getirebilirsiniz.
Bu yazıda, Laravel'de modüler mimarinin nasıl uygulanacağını, avantajlarını ve popüler bir paket olan nwidart/laravel-modules kullanarak modüler yapının nasıl kurulacağını detaylı bir şekilde ele alacağız.
Modüler Mimari Nedir?
Modüler mimari, bir uygulamayı modüller halinde bölerek geliştirme yaklaşımıdır. Her modül, uygulamanın belirli bir işlevini kapsayan bağımsız bir birimdir. Örneğin, bir e-ticaret uygulamasında Ürün Yönetimi, Sipariş Yönetimi, Kullanıcı Yönetimi gibi modüller olabilir.
Bu yaklaşımın avantajları:
- Kod Yönetimi: Her modül bağımsız olduğu için kod karmaşıklığı azalır.
- Ekip Çalışması: Farklı ekip üyeleri farklı modüller üzerinde çalışabilir.
- Tekrar Kullanılabilirlik: Modüller başka projelerde kullanılabilir.
- Sürdürülebilirlik: Yeni özellikler eklemek veya mevcut olanları değiştirmek daha kolaydır.
Laravel'de Modüler Mimariyi Manuel Uygulama
Laravel'de modüler bir yapı oluşturmak için uygulamanızı manuel olarak bölümlere ayırabilirsiniz.
1. Modül Yapısının Oluşturulması
Proje dizininde her modül için ayrı bir klasör yapısı oluşturabilirsiniz. Örneğin:
app/
└── Modules/
├── Products/
│ ├── Controllers/
│ ├── Models/
│ ├── Routes/
│ └── Views/
└── Orders/
├── Controllers/
├── Models/
├── Routes/
└── Views/
2. Modül Dosyalarının Yapılandırılması
Controller:
Modül için özel bir controller oluşturabilirsiniz.
namespace App\Modules\Products\Controllers;
use App\Http\Controllers\Controller;
use App\Modules\Products\Models\Product;
class ProductController extends Controller
{
public function index()
{
$products = Product::all();
return view('products.index', compact('products'));
}
}
Model:
Her modül için bağımsız modeller oluşturabilirsiniz.
namespace App\Modules\Products\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = ['name', 'price', 'description'];
}
Route:
Her modül için özel route dosyası oluşturabilirsiniz ve bu dosyayı RouteServiceProvider içinde yükleyebilirsiniz.
// app/Modules/Products/Routes/web.php
use App\Modules\Products\Controllers\ProductController;
Route::prefix('products')->group(function () {
Route::get('/', [ProductController::class, 'index'])->name('products.index');
});
View:
Her modül için bağımsız view dosyaları oluşturabilirsiniz.
<!-- resources/views/products/index.blade.php -->
<h1>Ürünler</h1>
<ul>
@foreach($products as $product)
<li>{{ $product->name }} - {{ $product->price }}₺</li>
@endforeach
</ul>
Laravel'de Modüler Mimari için nwidart/laravel-modules Paketi
Manuel bir yapı oluşturmak zaman alıcı ve karmaşık olabilir. Bunun yerine, nwidart/laravel-modules gibi bir paket kullanarak modüler mimariyi hızlı bir şekilde uygulayabilirsiniz.
1. Paketin Kurulumu
composer kullanarak paketi yükleyin:
composer require nwidart/laravel-modules
Ardından, paketin servis sağlayıcısını otomatik olarak kaydetmek için aşağıdaki komutu çalıştırın:
php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"
2. Yeni Bir Modül Oluşturma
Aşağıdaki komutla bir modül oluşturabilirsiniz:
php artisan module:make Products
Bu komut, aşağıdaki yapıyı oluşturur:
Modules/
└── Products/
├── Config/
├── Console/
├── Http/
│ ├── Controllers/
│ └── Middleware/
├── Models/
├── Providers/
├── Resources/
│ ├── views/
└── Routes/
└── web.php
3. Modül İçin Controller ve Model Ekleme
Modülün Http/Controllers dizinine bir controller ekleyebilirsiniz:
namespace Modules\Products\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Products\Entities\Product;
class ProductController extends Controller
{
public function index()
{
$products = Product::all();
return view('products::index', compact('products'));
}
}
Modülün Entities klasörüne bir model ekleyebilirsiniz:
namespace Modules\Products\Entities;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = ['name', 'price', 'description'];
}
4. Modül Route’larını Tanımlama
Modül için rotaları Routes/web.php dosyasına ekleyebilirsiniz:
use Modules\Products\Http\Controllers\ProductController;
Route::prefix('products')->group(function () {
Route::get('/', [ProductController::class, 'index'])->name('products.index');
});
5. View Dosyalarını Oluşturma
Modülün Resources/views dizininde bir view dosyası oluşturabilirsiniz:
<!-- Modules/Products/Resources/views/index.blade.php -->
<h1>Ürünler</h1>
<ul>
@foreach($products as $product)
<li>{{ $product->name }} - {{ $product->price }}₺</li>
@endforeach
</ul>
Modüler Mimariyi Genişletme
Bir projede birden fazla modül olduğunda, modüller arasında bağımsızlık sağlanabilir. Örneğin, Sipariş Yönetimi modülü tamamen Ürün Yönetimi modülünden ayrı olabilir. Modüller arasındaki iletişim, servis sınıfları veya API üzerinden sağlanabilir.
Sonuç
Laravel'de modüler mimari, büyük ölçekli projelerde sürdürülebilirliği ve kodun okunabilirliğini artırmak için etkili bir yaklaşımdır. nwidart/laravel-modules gibi bir paket kullanarak bu yapıyı hızlıca hayata geçirebilir ve projelerinizi daha düzenli hale getirebilirsiniz.
Bu yapı, özellikle ekip çalışmasında, modüller arasında net sınırlar çizerek karmaşıklığı azaltır ve projelerinizi daha yönetilebilir kılar. Laravel'in sağladığı esnek yapı, modüler mimariyi kolayca uygulamanıza olanak tanır.
