Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$.ready() jQuery для всё тех же веб-компонентовТак что наблюдаемая картина — думаю не самое худшее, что может произойти.

В целом composer хорош для отдельных библиотек, но плагины в том же Wordpress вы через composer не поставите, это вам как небольшая аналогия.
.tab-size-1{-moz-tab-size:1;-o-tab-size:1;tab-size:1}
.tab-size-2{-moz-tab-size:2;-o-tab-size:2;tab-size:2}
.tab-size-3{-moz-tab-size:3;-o-tab-size:3;tab-size:3}
.tab-size-4{-moz-tab-size:4;-o-tab-size:4;tab-size:4}
.tab-size-5{-moz-tab-size:5;-o-tab-size:5;tab-size:5}
.tab-size-6{-moz-tab-size:6;-o-tab-size:6;tab-size:6}
.tab-size-7{-moz-tab-size:7;-o-tab-size:7;tab-size:7}
.tab-size-8{-moz-tab-size:8;-o-tab-size:8;tab-size:8}
.tab-size-9{-moz-tab-size:9;-o-tab-size:9;tab-size:9}
.tab-size-10{-moz-tab-size:10;-o-tab-size:10;tab-size:10}
.tab-size-11{-moz-tab-size:11;-o-tab-size:11;tab-size:11}
.tab-size-12{-moz-tab-size:12;-o-tab-size:12;tab-size:12}
@-moz-document regexp("https?:\\/\\/github\.com\\/nazar-pc.*") {
* {
-moz-tab-size : 4;
}
}
.tab-size-8, это подтверждение того, что виноват именно GitHub, он принудительно выставляет ширину табуляции в 8 пробелов.?ts=2 query; ребятам нужно лишь это начать поддерживать например в .gitattributes.
$Cache = \cs\Cache::instance();
$element = $Cache->element;
$Cache->element = 'new value';
unset($Cache->element);
<?php
namespace cs;
$Cache = Cache::instance();
$User = User::instance();
$ids = $Cache->get("posts/$User->id", function () use ($User) { // If not in cache - call function
$db = DB::instance();
return $db->qfas( //Query, Fetch, Array, Single column
"SELECT `id`
FROM `[prefix]posts`
WHERE `user` = '%d'",
$User->id
);
);
foreach ($ids as $id) {
var_dump($id); // int(1), int(2), etc.
}
Нет никаких фабрик, сервисов
$Cache = Cache::instance();
$User = User::instance();
То есть, это, конечно, проблемы тестов
Singleton, и его метод instance.Singleton::instance(), и у вас есть возможность управлять тем, что он вернет в результате вызова, а с помощью самого Singleton у вас есть возможность при необходимости добавить методы во все классы его использующие.Core в пространстве имен cs\custom, по скольку я знаю, что из внешнего мира будет использоваться только этот класс, то есть тест получился почти Unit (он затрагивает не только cs/Cache, но и конкретную реализацию кэша APC) тест.С точки зрения использования — несомненно, с точки зрения тестирования — скорее нет чем да.
cs\Cache::instance(), а в тестах использовать Mockery. Не вижу проблемы здесь.Почему вы считаете что IoC контейнер усложит все?
А теперь представьте как было бы удобно организовать разработку на базе CMS, которая позволяет за счет интерфейсов и аннотаций регламентировать поведение системы, а IoC и модуль конфигураций, нормальный раутер все бы это собирали вместе.
cs\Cache\_Abstract, который определяет интерфейс, необходимый классу для того, чтобы выступать в роли движка кэша, cs\Cache\APC его наследует и реализует абстрактные методы, а используете вы его не непосредственно, а через cs\Cache, который в зависимости от конфигурации использует тот или иной движок кэша под капотом. IoC тут по-моему совсем не нужен.Интеграционные тесты будут медленнее, но не то чтобы совсем
Если честно — меня очень смущает использование комментариев...
Зато не нужно следить за зависимостями, можно подменять реализации, автоматически регистрировать компоненты и т.д. То есть с точки зрения клиентского кода упрощается все.
<?php
# custom/Cache.php относительно корня сайта
namespace cs\custom;
class Cache extends \cs\Cache {
# Переопределяем что хотим и как хотим, если убрать наследование - вообще полная свобода
}
class MyRepositorSpec extends ObjectBehaviour
{
private $cacheMock;
// Cache это не класс а просто интерфейс.
// Вся магия превращающая его в мок на стороне Prophesy происходит.
function let(CleverStyle\Core\Cache $cache) {
$this->cacheMock = $cache;
}
function it_should_get_data_from_cache_if_it_is_available() {
$users = [['id' => 1, 'username' => 'nazarpc'], ['id' => 1, 'username' => 'fesor']];
// описываем какие методы должен дергать наш класс
// и записываем туда стабы
$this->cacheMock->has('users')->willReturn(true);
$this->cacheMock->get('users')->willReturn($users);
$this->findAll()->beLike($users);
}
function it_uses_db_only_if_no_data_in_cache_available()
{
$this->cacheMock->has('users')->willReturn(false);
}
}
Cобрать лучшее из двух миров — фреймворков и CMS (часть 1)