Laravel Service Container(Repository PAttern Example)
Herkese merhabalar bu yazımızda sizlerle beraber Laravel service container yapısını inceliyor olacağız. Laravel service container’lar , 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, yani ne demek istiyoruz ? Bir sınıf diğer bir sınıfa bağlı bir şekilde new anahtar kelimesi ile oluşturuluyorsa tam olarak burada dependency ınjection yapıp container’ları kullanmamız gerekiyor.
Örnek senaryamuz için repository design pattern kullanan bir uygulama yapmaya çalışalım.Dilerseniz hemen başlayalım.
Proje Oluşturma
composer create-project laravel/laravel example-app
cd example-app
php artisan serve
Tanımlamalar;
Öncelikle bir userRepository interface oluşturalım, içerisinde get,all ve delete methodlarının imzalarını taşıyan bu interfacemizi, somut olan class(nesne) implement ediyor olacağız.
interface UserRepositoryInterface
{
public function get($id);
public function all();
public function delete($id);
}
Daha sonra ilgili somut UserRepository class’ımızı oluşturup interface implement edip içerisindeki methodları
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)
}
}
İlgili sınıfımızda laravel elequent model yapısını kullanarak örnek üzerinde user modelinden giderek interface üzerindeki ilgili methodlarımızı geliştirdik ve şimdi sırada Provider’a register etmek kaldı. Yeni bir Service Provider oluşturuyoruz.
php artisan make:provider RepositoryProvider
ilgili provider oluşturduktan sonra register methodunda interface istediğimiz zaman bize bir class üretmesini istediğimi belirttik.Register methodunda bind ederken dikkat edilmesi gereken öncelikle bağımlılık sonrasında ise kullanacağınız sınıftır.
<?phpnamespace App\Providers;
use Illuminate\Support\ServiceProvider;class RiakServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(
UserRepositoryInterface::class,
UserRepository::class
);
}
public function boot()
{
//
}
}
Ş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;
class UserController extends Controller
{
private $userRepository;public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
}
diyerek constructurda ilgili bağımlılığımızı enjekte edip dilediğimiz gibi bağımlılığımızın içerisinde yer alan fonksiyonları kullanabiliriz.
Herkese İyi Çalışmalar Dilerim.