Сегодня у нас тут светило яркое теплое солнышко, и у меня появились силы помучать абстрактного коня.
Вот что я тут надумал: сеттеры раздражают, инъектить каждый сервис в каждую модель - лень. В конструктор сервисы передать можно не всегда. Например, если расширяю ArrayObject или SplFixedArray - конструктор занят. ServiceLocator с конфигами - overkill, хочу без конфигов.
Придумал хак - инъектить сам контейнер через трейт.
Мелочь, но еще не встречал.
Трейт
Модель
bootstrap
Расскажите, пожалуйста, почему я [ваш любимый эпитет]. Именно почему, а не кто 
Вот что я тут надумал: сеттеры раздражают, инъектить каждый сервис в каждую модель - лень. В конструктор сервисы передать можно не всегда. Например, если расширяю ArrayObject или SplFixedArray - конструктор занят. ServiceLocator с конфигами - overkill, хочу без конфигов.
Придумал хак - инъектить сам контейнер через трейт.
Мелочь, но еще не встречал.
Трейт
PHP:
<?php
/**
* This trait provides implicit injection of a dependency injection container
*/
namespace GK;
use Pimple\Container;
trait DIContainerTrait
{
/**
* @var Container
*/
public static $container;
/**
* @return Container
*/
public static function getContainer()
{
if ( static::$container !== NULL ) {
return static::$container;
}
$trait = __TRAIT__;
return $trait::$container;
}
public static function setContainer(Container $c = null)
{
self::$container = $c;
}
}
PHP:
namespace GK\Entities;
use GK\DIContainer;
class Product
{
use DIContainerTrait;
/**
* Counts the price rounded to tens
* @return mixed
*/
public function getPrice() {
return ceil( $this->getContainer()->CurrencyRate->getRate() * $this->attributes['price_usd'] / 10 ) * 10;
}
// ...skipped
}
PHP:
$container = new \GK\Container($settings);
GK\DIContainerTrait::setContainer($container);

Последнее редактирование: