İçeriğe geç →

Laravel Service Container’ları anlamak

Öncelikle belirtmek isterimki Service Container’ları anlamak için Depedency Inversion Prensibini ‘ı anlamak gerekir.Bu konsepti bilmeden size bu yazı biraz tuhaf gelebilir.

Öncelikle şu makaleyi okursanız daha iyi anlarsınız. http://www.canertosuner.com/post/ioc-container-nedir-ne-ise-yarar

Service Container

Laravel servis konteyneri, sınıf bağımlılıklarını yönetmek ve bağımlılık enjeksiyonunu gerçekleştirmek için güçlü bir araçtır. Bağımlılık enjeksiyonu esasen şu anlamına gelen süslü bir cümledir: sınıf bağımlılıkları sınıfa kurucu veya bazı durumlarda ‘ayarlayıcı’ yöntemleri yoluyla ‘enjekte edilir’.

Nerelerde Lazım olur ?

Örnek senaryo : Sisteminize Bir Twitter entegrasyonu yapıyorsunuz ve Twitter Class’ının construct’ında sizden api key istiyor. Bu sınıfı Dependency Injection yapmamız için api keyi constructor’da girmemiz gerekmekte peki biz bunu construct methodunun içinde veremeyeceğimize göre yani bağımlılığı enjenkte etmemiz gerekiyor.Buradada Service(IOC) Container’lar devreye giriyor.

$twitter = new Twitter([‘api’ => ‘key’]);

$this->app->bind('Twitter', function () {
    return new \Twitter(['api'=>'KEY']);
});

Örnek Senaryo : Laravel’e Repository Pattern’i uygulamak istedik.Repository Pattern bir repository interface’sinden implement ettik.Böylece Repository Sınıfı RepositoryInterface’e bağımlı hale geldi ve biz bu Repository Sınıfını Construct Injection ile bir sınıfın içerisinde kullanmak istedik.

UserRepositoryInterface

namespace App\Repositories;

interface UserRepositoryInterface
{
   
    public function get($id);
  
    public function all();

    public function delete($id);

}

UserRepository

namespace App\Repositories;

use App\User;

class UserRepository implements UserRepositoryInterface
{
    
    public function get($id)
    {
        return User::find($id);
    }

   
    public function all()
    {
        return User::all();
    }

   
    public function delete($id)
    {
         User::destroy($id)
    }

   
}

Şimdi sırada Provider’a register etmek kaldı. Yeni Bir Service Provider oluşturuyoruz.

RepositoryProvider

<?php

namespace App\Providers;


use Illuminate\Support\ServiceProvider;

class RepositoryProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {

        // BIND TO SERVICE CONTAINER
        $this->app->bind(
            UserRepositoryInterface::class,
            UserRepository::class
        );
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

Register methodna bind ederken dikkat edilmesi gereken öncelikle bağımlılık sonrasında ise kullanacağınız sınıftır.

Şuan tek yapmamız gereken laravel’e yeni providerımıza haberdar etmek bunun için

config/app.php’de bulunan providers dizisinin içine RepositoryProvider’ı eklememiz gerekmektedir.

Kullanım

UserController.php

class UserController extends Controller
{
    private $userRepository;

    public function __construct(UserRepositoryInterface $userRepository)
    {
        $this->userRepository = $userRepository;
    }

Yukarıda Dependency Injection yaparak. SOLID Prensiblerine uymuş olduk.

ardından

php artisan optimize:clear
composer dump-autoload -o

komutlarını çekiniz.

Sağlıcakla kalın.

Kategori: php

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir