Dependeny Injection
Was ist eine Abhängigkeit?
BookingController
BookingRepository
Logger
Beispiel
BookingController
BookingRepository
Logger
<?php
class BookingController {
/** @var RepositoryInterface */
private $repository;
/** @var LoggerInterface */
private $logger;
public function __construct() {
$this->repository = new BookingRepository();
$this->logger = new Logger();
}
}
- Was ist mit Configuration?
- Haben die Abhängigkeiten auch Abhängigkeiten?
BookingController
BookingRepository
Logger
<?php
class BookingController {
/** @var RepositoryInterface */
private $repository;
/** @var LoggerInterface */
private $logger;
public function __construct() {
$this->repository = BookingRepository::getInstance();
$this->logger = Logger::getInstance();
}
}
- Singleton ist ein Antipattern!
- Wie ist der Status der Instanzen?
- Nicht testbar!
- Unterabhängigkeiten?
No Go!
BookingController
BookingRepository
Logger
Abhängigkeitstypen
Notwendige Abhängigkeit
Hinreichende Abhängigkeit
Notwendige Abhängigkeit
Hinreichende Abhängigkeit
<?php
class BookingController {
/** @var RepositoryInterface */
private $repository;
/** @var LoggerInterface */
private $logger;
public function __construct(RepositoryInterface $repository) {
$this->repository = $repository;
$this->logger = new NullLogger(); // NullObject Pattern
}
public function setLogger(LoggerInterface $logger) {
$this->logger = $logger;
}
}
<?php // from "psr/log" within "monolog/monolog".
namespace Psr\Log;
/**
* This Logger can be used to avoid conditional log calls
*
* Logging should always be optional, and if no logger is provided to your
* library creating a NullLogger instance to have something to throw logs at
* is a good way to avoid littering your code with `if ($this->logger) { }`
* blocks.
*/
class NullLogger extends AbstractLogger
{
/**
* Logs with an arbitrary level.
*
* @param mixed $level
* @param string $message
* @param array $context
* @return null
*/
public function log($level, $message, array $context = array())
{
// noop
}
}
NullObject Pattern
Dependency Injection Container
- Zentraler Service
- Registriert Services
- Löst Abhängigkeiten on-demand auf
DI Container
Gib mir 'controller.booking'
controller.booking
- repository.booking
- logger
repository.booking
- entity_manager
logger
entity_manager
Dependency Injection Container in PHP
- Symfony\Component\DependencyInjection\Container
- Zend\Di\Di
- Pimple
- Di\Container (PHP-DI)
DI Nachrüsten?
Fragen?
Dependency Injection in PHP
By neusta Coaching-Team
Dependency Injection in PHP
Eine kleine Einführung in das Prinzip der Dependency Injection mit Inbezugnahme auf PHP
- 1,067