class Laravel Modüler Mimari extends Post

@created_at( "2025-01-15 15:04" ) @tag( "laravel" )
# Mikroservis mimarisi, büyük ve karmaşık projelerde servislerin bağımsız olarak geliştirilip yönetilmesini sağlar. Ancak, Laravel projelerinde bu yapıyı doğrudan uygulamak yerine, **modüler mimari** kullanarak benzer bir yapı elde edebiliriz. Laravel'in "Modüler Mimari" desteği, tek bir uygulama içerisinde servisleri bağımsız bir şekilde geliştirmemizi sağlar. Bu makalede, **nwidart/laravel-modules** paketi kullanarak nasıl modüler bir yapı oluşturabileceğimizi inceleyeceğiz. --- ## Modüler Mimari Nedir? Modüler mimari, uygulamayı birden fazla bağımsız modüle ayırarak yönetilebilir ve ölçeklenebilir hale getiren bir yaklaşımdır. Her modül, belirli bir işlevi yerine getiren bağımsız bir yapı olarak geliştirilir. Örneğin: - **UserManagement**: Kullanıcı yönetimiyle ilgili işlemler. - **OrderManagement**: Sipariş yönetimiyle ilgili işlemler. - **ProductManagement**: Ürün yönetimiyle ilgili işlemler. --- ## 1. Paket Kurulumu **nwidart/laravel-modules** paketi, Laravel'de modüler bir yapı oluşturmak için kullanılır. Paketi kurmak için aşağıdaki adımları takip edebilirsiniz: ### Paket Kurulumu
composer require nwidart/laravel-modules
### Yapılandırma Dosyalarını Yayınla
php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"
Bu işlem, `config/modules.php` dosyasını oluşturur. Burada modüllerinize ilişkin ayarları yönetebilirsiniz. --- ## 2. Modül Oluşturma Yeni bir modül oluşturmak için aşağıdaki komutu kullanabilirsiniz:
php artisan module:make UserManagement
Bu komut, `Modules` dizini altında bir modül oluşturur: ``` Modules/ └── UserManagement/ ├── Config/ ├── Http/ │ ├── Controllers/ │ ├── Middleware/ │ └── Requests/ ├── Models/ ├── Resources/ │ ├── views/ │ └── lang/ ├── Routes/ └── ... ``` Her modül kendi içerisinde bağımsız bir Laravel uygulaması gibi davranır. --- ## 3. Modül Bazlı Yapılandırma ### 3.1. Modül Bazlı Routing Her modülün kendi rotalarını tanımlayabilmesi için `Routes` dizininde bir `web.php` dosyası oluşturulur. `Modules/UserManagement/Routes/web.php`:
use Modules\UserManagement\Http\Controllers\UserController;

Route::prefix('user-management')->group(function () {
    Route::get('/users', [UserController::class, 'index']);
});
Laravel bu rotaları otomatik olarak yükler. ### 3.2. Modül Bazlı Controller Modüllerin kendi controller sınıfları `Http/Controllers` dizininde tanımlanır. `Modules/UserManagement/Http/Controllers/UserController.php`:
namespace Modules\UserManagement\Http\Controllers;

use App\Http\Controllers\Controller;

class UserController extends Controller
{
    public function index()
    {
        return view('usermanagement::users.index');
    }
}
### 3.3. Modül Bazlı View Her modülün kendine özgü view dosyaları `Resources/views` dizininde saklanır. `Modules/UserManagement/Resources/views/users/index.blade.php`:
<h1>Kullanıcı Yönetimi</h1>
--- ## 4. Modüller Arası İletişim ### 4.1. Service Providers Modüller arasında bağımlılık yönetimini kolaylaştırmak için her modül bir `ServiceProvider` tanımlar. `Modules/UserManagement/Providers/UserManagementServiceProvider.php`:
namespace Modules\UserManagement\Providers;

use Illuminate\Support\ServiceProvider;

class UserManagementServiceProvider extends ServiceProvider
{
    public function register()
    {
        // Modüle özel servisler kaydedilir.
    }

    public function boot()
    {
        $this->loadRoutesFrom(__DIR__ . '/../Routes/web.php');
    }
}
### 4.2. Event ve Listener ile İletişim Laravel’in Event-Listener yapısını kullanarak modüller arasında iletişim sağlayabilirsin. **Event Tanımlama:** `Modules/UserManagement/Events/UserRegistered.php`:
namespace Modules\UserManagement\Events;

use Illuminate\Queue\SerializesModels;

class UserRegistered
{
    use SerializesModels;

    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }
}
**Listener Tanımlama:** `Modules/OrderManagement/Listeners/CreateWelcomeOrder.php`:
namespace Modules\OrderManagement\Listeners;

use Modules\UserManagement\Events\UserRegistered;

class CreateWelcomeOrder
{
    public function handle(UserRegistered $event)
    {
        // Sipariş oluşturma işlemi
    }
}
--- ## 5. Modüllerin Yönetimi ### Modül Listeleme Tüm modülleri listelemek için:
php artisan module:list
### Modül Aktif/Pasif Yapma Bir modülü aktif veya pasif hale getirebilirsiniz:
php artisan module:enable UserManagement
php artisan module:disable UserManagement
--- ## 6. Test ve İzolasyon Her modül kendi testlerini bağımsız olarak yazabilir. `Modules/UserManagement/Tests/Feature/UserTest.php`:
namespace Modules\UserManagement\Tests\Feature;

use Tests\TestCase;

class UserTest extends TestCase
{
    public function test_user_list_is_accessible()
    {
        $response = $this->get('/user-management/users');
        $response->assertStatus(200);
    }
}
--- ## Sonuç Laravel'in modüler mimarisi, tek bir uygulama içinde mikroservis benzeri bir yapı oluşturmanı sağlar. Bu yaklaşım, kodun daha düzenli, ölçeklenebilir ve yönetilebilir olmasına katkıda bulunur. Özellikle büyük projelerde, modüller arasında bağımsız geliştirme yapılabilir ve böylece ekipler birbirinden izole bir şekilde çalışabilir. Daha fazla detay veya örnek uygulama için Laravel dokümantasyonunu ve `nwidart/laravel-modules` paketinin kılavuzunu inceleyebilirsin.