PHP программист (Symfony)

написал в блог:
Абстракции и как они текут
Как джуниор-разработчику найти работу (vc.ru)
Тестовые задания для джуниоров PHP

написал на Хабре:
Геттеры/сеттеры и проблема с инкапсуляцией в Symfo...
Контакты
Местоположение
Россия, Москва и Московская обл., Москва

Достижения

Все достижения (73)

Наибольший вклад в теги

Все теги (271)

Лучшие ответы пользователя

Все ответы (964)
  • Полиморфизм в базе данных, как организовать таблицы?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Разделяйте ответственности
    OrganisationSeller и PersonSeller могут наследоваться от Seller
    и для реализации такого можно реализовать такой паттерн Single Table Inheritance

    А вот обычные Organisation и Person связывайте с абстрактным Seller через обычную связь. Конкретные наследники будут лежать в зависимости от типа

    Итого будет так:
    (OrganisationSeller extends Seller) будет объектом Organisation.seller

    Готовые решения:
    Ответ написан
  • Когда применяем паттерн Стратегия, а когда Декоратор?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Стратегия = полиморфизм, то есть мы завязаны на некий интерфейс, а какая реализация — нам не важно. Это история про зависимости. Ну например почтальон отдает пенсию бабушкам (любым, какой бабушке именно — зависит от стратегии, КОТОРАЯ НЕ СВЯЗАНА с модификацией конкретной бабушки:)

    Декоратор, это про добавить функционал в рамках одного интерфейса, тут вообще не рассматривается вопрос каких-либо отношений (к примеру бабушки и почтальона), тут рассматривается — бабушка в шубе или бабушка с загаром или бабушка на коляске, все та же бабушка, но "обернутая" неким поведением :) Главное что бабушка всегда остается быть той самой для всех бабушкой. То есть это не противопоставление — ни в начале ни в середине мы не завязываемся на дополнительное поведение бабушки у почтальона. Бабушка и все, а какая именно — зависит от стратегии разноса (например по названию улицы). Если выйдет к нему "декорированная" бабушка-качок — пенсию он даст ей также, как и не качку, тк она для него всего лишь некий субъект/абстракция, главное чтобы возраст и ФИО сошлись.

    Соответственно это никак не похожие паттерны, один поведенческий, другой структурный... Они применяются всегда в любой этап разработки. Я в самом начале могу сделать декоратор обычной бабушки в виде поющей бабушки, а почтальона или внука в виде стратегии написать потом. А могу наоборот — сначала научить возить бабушек на трамвае (через стратегию), а бабушек с костылями (декоратор) добавить позже...

    Кое-где не корректные аналогии, и в аналогии стратегия есть бабушка, но в целом для понимания норм и не критично :)
    Ответ написан
  • PHPUNIT: Как возвращать разные значения в методе мока?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Так точно работает:
    $this->anyMock
        ->expects($this->exactly(4))
        ->method('doSomething')
        ->withConsecutive(...$args)
        ->willReturnOnConsecutiveCalls(...$results)

    Кол-во $args и $results и цифра в $this->exactly(4) одинаково,
    $args - массив массивов


    UPD: Сейчас глянул код, по идее ваш способ абсолютно эквивалентный и должен работать, либо приведенный мной будет ругаться также. переменные $response1 и $response2 точно имплементят ResponseInterface?

    Причина проблемы:
    Вы просто настраиваете мок на одно число вызовов, а в ассертах вызываете меньшее число раз (в примере -- настроили на 4 ответа, а ассертов всего 3, то есть 1 остался заряженный) и в моке остается значение, которое потом вызывается каким-либо образом в других ситцациях!
    Классический сайд эффект. Нужно после использованного мока удостовериться, что он пустой или в новом тесте заново его создать, скорее всего у вас мок в приватной переменной класса и потому состояние шарится между методами теста...

    Именно поэтому вам expects() скорее всего и подсказала, в чем дело.

    Решения:
    1. Создавать мок именно в методе, не злобоупотреблять setUp()
    2. Контроллировать число вызовов в методе и аргументов для Consecutive Calls, в этом поможет expects($this->exactly(N))
    Ответ написан
  • Doctrine как разрешить состояние гонки?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Помимо варианта с Lock: ON CONFLICT (expression) DO NOTHING и похожие решения в других СУБД могут быть иногда довольно подходящими в виду простоты реализации...

    Это выглядит буквально вот так:
    $sql = <<<SQL
    INSERT INTO table (id, value) 
    VALUES (555, \'uniqValue\') 
    ON CONFLICT (value) DO NOTHING
    SQL;
    
    $this->em->getConnection()->executeQuery($sql);


    Если это некие логи или словари с простой логикой хранения, то в самый раз...
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (46)