Es un método por el cuál el control del flujo de programación no lo da el código programado por nosotros sino por el framework que estemos utilizando.
Martin Fowler lo define como "Hollywood Principle"
Se puede considerar la principal diferencia entre framework y librería. La librería es algo que usamos y llamamos cuando necesitamos. El framework orquesta toda nuestra aplicación.
Se puede decir que es lo que nos ayuda a abstraernos para desarrollar solo nuestra aplicación y que el framework se encargue de la trivialidad de, por ejemplo, toda la capa HTTP de una web.
Es un concepto desarrollado a Robert C. Martin y es una de las respuestas para dos de los principios solid: Open/Close y Liskov substitution
Uno de los principales problemas en el desarrollo es el acoplamiento. Para solucionarlo, las clases de capas superiores deberían depender de abstracciones y no de implementaciones de clases inferiores (y viceversa).
Inyección de dependencias es cuando el ContenedorDI (biblioteca, framework, módulo místico que armamos) inyecta a un objeto las dependencias del mismo.
Permite que nuestro código dependa de abstracciones que "alguien" va a resolver sin necesidad de que tengamos que explicitarlas al instanciar o invocar un método.
class ShoppingCart {
protected $paymentMethod;
public function __construct() {
$this->paymentMethod = new CreditCardPaymentMethod();
}
}
class CreditCardPaymentMethod {
public function validate()
...
}
class DirectDepositPaymentMethod {
public function validate()
...
}
interface IPaymentMethod {
public function validate();
}
class CreditCardPaymentMethod implements IPaymentMethod {
public function validate()
...
}
class DirectDepositPaymentMethod implements IPaymentMethod {
public function validate()
...
}
class ShoppingCart {
protected $paymentMethod;
public function __construct(IPaymentMethod $paymentMethod) {
$this->paymentMethod = $paymentMethod;
}
}
$shoppingCart = new ShoppingCart(new CreditCardPaymentMethod());
class PaymentMethodEnum {
const CREDIT_CARD = 1;
const DIRECT_DEPOSIT = 2;
}
class ShoppingCartFactory {
public function Create ($idPaymentType) {
$method = null;
switch ($idPaymentType) {
case PaymentMethodEnum::CREDIT_CARD:
$method = new CreditCardPaymentMethod();
break;
case PaymentMethodEnum::DIRECT_DEPOSIT:
$method = new DirectDepositPaymentMethod();
break;
default:
throw new InvalidMethodException();
}
return new ShoppingCart($method);
}
}
$factory = new ShoppingCartFactory();
$shoppingCart = $factory->Create(Input::get('selectedMethod'));