Dependency injector
What is a Dependency injector?
Instead of creating objects directly in your code, you can pass them in as dependencies. It let´s you effortlessly integrate your services into other services and controllers. But what does this mean?
Suppose you have four service classes named:
Http\Services\YourFirstService
Http\Services\YourSecondService
Http\Services\YourThirdService
Http\Services\YourFourthService
YourSecondService serve as dependencies for YourFirstService, while YourFourthService is dependent on YourThirdService.
1. Without a Dependency Injector
Without a Dependency Injector, you might handle it like this (not recommended):
<?php
namespace Http\Controllers;
use Http\Services\YourFirstService;
use Http\Services\YourSecondService;
use Http\Services\YourThirdService;
use Http\Services\YourFourthService;
class Pages
{
public function __construct()
{
$yourSecondService = new YourSecondService();
$yourFourthService = new YourFourthService();
$yourThirdService = new YourThirdService($yourFourthService);
$yourFirstService = new YourFirstService($yourSecondService);
// YourFirstService, YourFirstService, YourThirdService, YourFourthService
// Has been initiated
}
}
Even though this is a simple example where class objects have a maximum of 2 levels, it still looks somewhat messy. But imagine if the classes had 4 levels of dependencies – without a dependency injector, you would lose control.
2. With the Dependency Injector
With the Dependency Injector, you can streamline the process:
<?php
namespace Http\Controllers;
use Http\Services\YourFirstService;
use Http\Services\YourThirdService;
class Pages
{
public function __construct(YourFirstService $yourFirstService, YourThirdService $yourThirdService)
{
// YourFirstService, YourSecondService, YourThirdService, YourFourthService
// Has been initiated
}
}
Not as complicated anymore, thanks to the Dependency Injector, which automatically resolves all dependencies. That is what makes the Dependency injector a valuable tool in your arsenal.
How do I access the Dependency injector?
Controllers will have the Dependency injector loaded by default. This means that if you load a Service class in your Controller, all dependencies of that Service will be automatically resolved and so on until all Services/dependencies has been initiated.
The Dependency Injector is specifically designed to work with the __construct method. However, you can still access it manually within a regular method like this:
<?php
namespace Http\Controllers;
use MaplePHP\Foundation\Http\Provider;
use Http\Services\YourFirstService;
use Http\Services\YourThirdService;
class Pages
{
private $provider;
public function __construct(Provider $provider, YourFirstService $yourFirstService)
{
// Provider, YourFirstService, YourSecondService
// Has been initiated
$this->provider = $provider;
}
public function aboutUs($response, $request)
{
$this->provider->set("yourThirdService", YourThirdService::class);
// YourThirdService, YourFourthService
// Has been initiated
$this->provider->yourThirdService()->yourMethod();
}
}
Don't worry if you don't fully comprehend what the Dependency Injector is and how it works. In the next step, I will start showing you some working examples. Let's move on and talk about the Controller.
Last updated
Was this helpful?