Oh god, another post about Inversion of Control
<?php class OrderModel { public function getOrder($orderID) { $orderRepository = new MySQLOrderRepository(); $order = $orderRepository->load($orderID); return $this->prepareOrder($order); } private function prepareOrder($order) { //some order preparing } } class MySQLOrderRepository { public function load($orderID) { // makes query to DB to fetch order row from table } }
<?php class OrderModel { public function getOrder($orderID) { $factory = new DBOrderRepositoryFactory(); $orderRepository = $factory->build(); $order = $orderRepository->load($orderID); return $this->prepareOrder($order); } private function prepareOrder($order) { //some order preparing } } abstract class OrderRepositoryFactory { /** * @return IOrderRepository */ abstract public function build(); } class DBOrderRepositoryFactory extends OrderRepositoryFactory { public function build() { return new MySQLOrderRepository(); } } class RemoteOrderRepositoryFactory extends OrderRepositoryFactory { public function build() { return new OneCOrderRepository(); } } interface IOrderRepository { public function load($orderID); } class MySQLOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to DB to fetch order row from table } } class OneCOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to 1C to fetch order } }
<?php class OrderModel { public function getOrder($orderID) { $orderRepository = ServiceLocator::getInstance()->get('orderRepository'); $order = $orderRepository->load($orderID); return $this->prepareOrder($order); } private function prepareOrder($order) { //some order preparing } } class ServiceLocator { private $services = array(); private static $serviceLocatorInstance = null; private function __construct(){} public static function getInstance() { if(is_null(self::$serviceLocatorInstance)){ self::$serviceLocatorInstance = new ServiceLocator(); } return self::$serviceLocatorInstance; } public function loadService($name, $service) { $this->services[$name] = $service; } public function getService($name) { if(!isset($this->services[$name])){ throw new InvalidArgumentException(); } return $this->services[$name]; } } interface IOrderRepository { public function load($orderID); } class MySQLOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to DB to fetch order row from table } } class OneCOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to 1C to fetch order } } // somewhere at the entry point of application ServiceLocator::getInstance()->loadService('orderRepository', new MySQLOrderRepository());
<?php class OrderModel { /** * @var IOrderRepository */ private $repository; public function getOrder($orderID) { $order = $this->repository->load($orderID); return $this->prepareOrder($order); } public function setRepository(IOrderRepository $repository) { $this->repository = $repository; } private function prepareOrder($order) { //some order preparing } } interface IOrderRepository { public function load($orderID); } class MySQLOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to DB to fetch order row from table } } class OneCOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to 1C to fetch order } } $orderModel = new OrderModel(); $orderModel->setRepository(new MySQLOrderRepository());
<?php class OrderModel { /** * @var IOrderRepository */ private $repository; public function __construct(IOrderRepository $repository) { $this->repository = $repository; } public function getOrder($orderID) { $order = $this->repository->load($orderID); return $this->prepareOrder($order); } private function prepareOrder($order) { //some order preparing } } interface IOrderRepository { public function load($orderID); } class MySQLOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to DB to fetch order row from table } } class OneCOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to 1C to fetch order } } $orderModel = new OrderModel(new MySQLOrderRepository());
<?php class OrderModel implements IOrderRepositoryInject { /** * @var IOrderRepository */ private $repository; public function getOrder($orderID) { $order = $this->repository->load($orderID); return $this->prepareOrder($order); } public function setRepository(IOrderRepository $repository) { $this->repository = $repository; } private function prepareOrder($order) { //some order preparing } } interface IOrderRepositoryInject { public function setRepository(IOrderRepository $repository); } interface IOrderRepository { public function load($orderID); } class MySQLOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to DB to fetch order row from table } } class OneCOrderRepository implements IOrderRepository { public function load($orderID) { // makes query to 1C to fetch order } } $orderModel = new OrderModel(); $orderModel->setRepository(new MySQLOrderRepository());
Source: https://habr.com/ru/post/244517/
All Articles