• Почему Service Locator это зло и что использовать вместо?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все эти страшные слова - они на самом деле всегда про одно и то же - про связность. Когда ты хардкодишь внутри класса вызов какого-то конкретного сервиса - ты намертво к нему привязываешься. И чтобы поменять сервис на другой, ты будешь вынужден поменять код класса. Окей, поменял. И тут же в другом месте, где этот же класс использовался, что-то сломалось! И что теперь? Делать два класса, которые различаются одной строчкой? Нет конечно. А как тогда использовать один и тот же класс для обработки разных входящих данных (или одних и тех же данных, но разными способами)? Сделать его поведение изменяемым. То есть сделать изменяемыми те инструменты, которыми он пользуется - т.е. его зависимости.

    Поэтому все зависимости обычно передаются через конструктор (и поэтому и называются инъекция зависимостей.)

    Таким образом мы можем менять поведение класса, не меняя его код

    Но тут надо понимать, что всё это работает только при правильном применении ООП. А точнее просто при применении ООП. Потому что 98% "ООП" кода, который пишется на РНР - это голимая процедурщина, даже если она обёрнута в классы и методы. Если у тебя метод класса представляет из себя стену кода, которую ты тупо перенёс из файла, инклюдившегося в любимое похапешное спагетти - то это не ООП. Это та же процедурщина, вид сбоку. И смысл использования dependency injection ты с ним не почуствуешь. Будешь конечно применять, но в качестве карго культа - потому что тебе это на тостере написали.
    А вот когда твой код начнет становиться действительно объектным - тогда стразу станет понятнее.


    Похожим на сервис локатор является сервис- или DI-контейнер. Используемый вручную, он является тем же самым сервис локатором. Поэтому вручную его никогда не надо вызывать - что и запрещается в симфоневских конроллерах - а только для автоматического создания классов. В МВЦ у тебя ведь очень многие объекты создаются автоматом - сущности, контроллеры. И вот для того, чтобы при автоматическом создании экземпляра класса у тебя были на руках все требуемые сервисы - и нужен контейнер.

    Соотвтственно, ответ на вопрос "что использовать?" очень простой:
    - при ручном создании экземпляра объекта, все зависимости передавать в него через конструктор, а не получать "из воздуха" в коде.
    - при автоматическом создании экземпляра объекта, использовать dependency injection container

    В этим смысле очень полезно освоить Симфони - строгий фрейворк, в котором нет сервис локатора и в котором запрещено пользоваться контейнером напрямую.
    Ответ написан
    4 комментария
  • Как сделать автоматический деплой PHP приложения?

    ukko
    @ukko
    php, js (es6), golang, symfony, react
    .gitlab-ci.yml + deployer.org (или любой другой деплоер: capistrano, ansible, etc..)
    Ответ написан
    Комментировать
  • Как сделать автоматический деплой PHP приложения?

    @akeinhell
    Как вариант можешь глянуть интересный инструмент - deployer.org
    Ответ написан
    Комментировать
  • Почему nuxt такой медленный?

    evgensenin
    @evgensenin
    Yii2 || Laravel, vue & nuxt
    Тоже заметил подобное. (но не прям реальная тормознутость, просто отклик у php приложений на порядок меньше в миллисекундах(мс), чем на nuxt), возможно особенности nodejs
    Попробуйте пожалуйста https://github.com/arash16/nuxt-ssr-cache и напишите
    и на всяк случай - https://nuxtjs.org/api/configuration-build/#cache
    Ответ написан
    6 комментариев
  • Что такое end-to-end тестирование?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Понятие еnd-to-end обозначает всего-навсего классификацию тестов по уровню, на котором тестируется система, и, само по себе, ничего не говорит ни о том, какие конкретно должны быть эти тесты, ни о том, какую роль они играют в общей стратегии обеспечения/проверки качества и, также, не является методикой тестирования. (Методика - это совсем другое понятие.)

    Для понимания сути этого понятия хорошо сравнить его с модульным ("нижний" уровень) и интеграционным ("средний") тестированием на каком-нибудь конкретном примере. Давайте рассмотрим некий сферический webshop в вакууме. Предположим, в нем есть 50 классов и для большинства из них написаны модульные тесты. Они проверяют исключительно функционал конкретного модуля (чаще всего, класса), т.е. тот, что зависит только от самого модуля и ни от чего чего более. Потом есть интеграционные тесты. Они проверяют корректность работы отдельных "модулей", если их собрать вместе согласно архитектурe. Например, работает ли правильно "Корзина", состоящая, в свою очередь, из 10 классов (предварительно проверенных модульными тестами), или "Корзина", подключенная к "Вебморде" и т.д. Где-то повыше в этой иерархии есть такие интеграционные тесты, которые проверяют конкретный функционал всей системы. Например, отправляется ли юзеру мейлом копия оплаченного заказа...

    И вот тут начинается самое интересное для понимания того, что такое end-to-end тестирование! Можно представить себе тест, проверяющий, что соответствующий мейл генерируется и сбрасывается SMTP серверу. Если SMTP сервер не рассматривать, как часть разрабатываемой системы, то этот тест вполне можно назвать end-to-end тестом (послали кучку HTTP запросов через "Вебморду" и проверили сброс мыла на SMTP - все зашибись!). Однако, если настройки и эксплуатация SMTP сервера - часть проекта (например, заказана разработка webshop "под ключ"), может оказаться, что это мыло будет отфильтровано каким-нибудь спам-фильтром, превысит лимит почтового ящика пользователя... короче, не дойдет до него. Тогда этот же самый тест уже нельзя считать end-to-end, а нужно бы было написать тест, проверяющий приход мыла в POP3/IMAP ящик. (Опять же, если это действительно нужно! Ибо, в зависимости от конкретных функциональных и нефункциональных требований, архитектор и QA инженер вполне могут найти возможность обеспечить адекватный контроль качества и без такого теста.)

    Таким образом, end-to-end тесты, это такие интеграционные тесты, которые воздействуют на систему через ее самые внешние интерфейсы и проверяют ожидаемую реакцию системы через эти же интерфейсы. Почему именно интеграционные? Потому, что это единственное, что можно о них сказать наверняка: они по определению не могут быть модульными тестами. А все остальное: являются ли они одновременно приемочными, нагрузочными или еще какими - зависит только от общих плана/стратегии тестирования и той роли, которые эти тесты в них играют.
    Ответ написан
    Комментировать
  • Книга по ООП в PHP, Мэтт Зандстра. Большая ли разница между 4-м и 5-м изданием?

    Mantiiicore
    @Mantiiicore
    Честно, каких-либо существенных изменений я не заметил. В основном книга была просто дополнена. Из явных отличий: теперь код примеров соответствует PSR, также раздел про системы контроля версий был переписан с акцентом на Git.
    Ответ написан
    1 комментарий
  • Почему body min-height не работает?

    @hesrun
    Min-height 100%, работает только в том случае, если у родителя указан height, в вашем случае это ,html тэг
    Ответ написан
    1 комментарий
  • Есть ли хорошие курсы по Symfony?

    На текущий момент ничего приличного по четвёртой симфони не видел, разве что официальные курсы (но там подписка с довольно кусачей ценой).
    Однако, скоро (надеюсь) должен выйти мастер-класс от Елисеева (vk), который обещает быть очень интересным
    Ответ написан
    2 комментария
  • Yii2 и deploy на сервер?

    Первый деплой:
    git clone
    composer install
    yii init
    #правите локальные конфиги (прописываете базу)
    yii migrate


    следующие деплои:
    git pull
    composer install
    yii migrate


    миграции создаем ручками
    yii migrate/create createUserTable
    и правим файл миграции
    Ответ написан
    10 комментариев
  • Стоит ли учить Ruby и Rails в 2016 году?

    vicodin
    @vicodin
    Имею некоторый опыт
    Попробуйте и решите сами, я вот лично очень люблю руби как язык, но рельсы это просто ад для меня, в свое время сделал выбор в пользу фулл стэка JS, а затем сконцентрировался только на фронтэнде. Не жалею.
    Ответ написан
  • Насколько "быдлокодерским" подходом является хранение сериализованных массивов в SQL?

    trevoga_su
    @trevoga_su
    Все зависит от задачи. Пример - конфиг пользователя. Смысла хранить его в реляционной структуре практически нет. Никто не будет по этому конфигу делать какую-то статистику или поиск. Добавление нового свойства для конфига - сделать чекбокс в шаблоне, образно говоря. Одним запросом вытащили сериализацию, получили масив с параметрами .. PROFIT!
    Ответ написан
    Комментировать
  • Насколько "быдлокодерским" подходом является хранение сериализованных массивов в SQL?

    laska
    @laska
    PHP/JS разработчик
    В идеальном мире, где пони какают бабочками, так делать конечно нельзя.
    В нашем мире, такое есть, к примеру, в Wordpress - самой популярной CMS в мире.
    Разумеется, у вордпресса весьма уродливый код, но это не мешает им быть сверхуспешными.

    Давайте по чесноку. Нормализированная таблица это круто, но зачастую очень дорого. Кинуть данные сериализированного массива в ячейку и потом ее достать - 10 минут работы программиста.
    Проектировать хорошую БД - на порядки сложнее (и требует программистов более высокой квалификации).
    И самое печальное, второй вариант на 1500 записей не нужен. Можно и в файлах хранить, в общем то. Но с БД будет несколько прикольных фич из коробки. Если хранить в файлах, нужно писать ORDER или SELECT самим, что занимает некоторое время.

    Поэтому, с точки зрения бизнеса, подход "и так сойдет" более выгоден по деньгам, хоть и оскорбляет ваше чувство прекрасного.
    Ответ написан
    5 комментариев
  • Можно ли доверять ресурсу learn.javascript.ru?

    @WapGeaR
    Программист
    Отличные курсы на learn.javascript, но все же сторонняя инфа тоже нужна. Никогда не учитесь по одному источнику, миксуйте!
    Ответ написан
    Комментировать
  • Что читать после learn.javascript.ru?

    Symphony
    @Symphony Куратор тега JavaScript
    Дэвид Флэнаган - JavaScript. Подробное руководство
    Дуглас Крокфорд - JavaScript: сильные стороны
    Addy Osmani - Learning JavaScript Design Patterns
    Ответ написан
    Комментировать
  • Изучение Symfony2/Laravel, сколько времени потребуется?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    сколько примерно времени займёт период от начала изучения до первого собеседования

    По персонажам которые приходят на собеседование могу сказать что некоторые и за год работы не знаю ничерта о том что и как они используют.

    На symfony2 в среднем проекты поинтереснее, так что я рекомендовал бы именно его. В любом случае переход laravel <-> symfony не является проблемой, ибо различия принципиальные там только в ORM идущей из коробки. Архитектура же этих фреймворков в целом схожа, разница в нюансах. Например в laravel мидлвэры как отдельная сущность, а в symfony они реализуются через события ядра, но суть та же. Еще нюансы с доктриной, эта штука довольно сложная и ее очень легко использовать неправильно, особенно с mysql. Но после того как разберетесь с ней возвращаться на всякие там active record-ы совсем не захочется. По сути это единственная полноценная ORM в php мире.

    Еще вне зависимости от выбора рекомендую ознакомиться с такими штуками как луковая/гексагональная архитектура, почитать чего по TDD и тестирование в целом. Кента Бэка например, Эрика Эванса.
    Ответ написан
    4 комментария
  • Под какие значения @media адаптировать дизайн сайта?

    llgruff
    @llgruff Автор вопроса
    Scala
    B-ww-mar-may-2015.jpgИсточник

    c8b86656c9de435c806298ea676beb45.PNGИсточник

    Ещё статистика

    Брейкпоинты фрэймворков
    breakpoints.pngСтаренькое
    Responsive-Widths_0.pngНа закуску
    Viewport Sizes

    UPD. Из презентации Яндекса о адаптивности интерфейсов:
    599b833421454dd9988f4d6b01c95f81.png
    Ответ написан
    Комментировать
  • Что такое core.autocrlf и core.safecrlf?

    @Holfamer Автор вопроса
    Настройка core.autocrlf с параметрами "true" и "input" делает все переводы строк текстовых файлов в главном репозитории одинаковы.
    core.autocrlf true - git автоматически конвертирует CRLF->LF при коммите и обратно LF->CRLF при выгрузке кода из репозитория на файловую систему (используют в Windows).
    core.autocrlf input - конвертация CRLF в LF только при коммитах (используют в Mac/Linux).

    Если core.safecrlf установлен на "true" или "warm", Git проверяет, если преобразование является обратимым для текущей настройки core.autocrlf.
    core.safecrlf true - отвержение необратимого преобразования lf<->crlf. Полезно, когда специфические бинарники похожие на текстовые файлы.
    core.safecrlf warn - печать только предупреждение, но принимает необратимый переход.

    Более полная инфа:
    core.autocrlf
    core.safecrlf
    Ответ написан
    Комментировать
  • Зачем в PHP нужна рефлексия?

    @Nc_Soft
    <?php
    
    class Stp008 {
       /**
        * Вытащи этот текст проще, че это сделал я
        */
    	public function get() {
    
    	}
    }
    
    $reflection = new ReflectionClass('Stp008');
    $method = $reflection->getMethod('get');
    echo $method->getDocComment();
    Ответ написан
    Комментировать