• Как разобраться с инверсией зависимостей?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Что такое адаптер?


    Смотрите. Есть у вас например micro USB кабель. И есть дырка в новом макбуке - Usb type c. Друг в друга они, как вы понимаете, не втыкаются. И можно взять адаптер microUSB -> USB type-c.

    В этом суть адаптера. Конвертация интерфейсов. Мы сделал интерфейс штуки которая нам нужна, потом взяли готовую штуку которая вроде бы то что нам надо делает, и сделали адаптер, который закрывает нестыковки в интерфейсах.

    Таким образом если вдруг через месяц обнаружатся проблемы, вы сможете заменить "готовую штуку" на другую готовую, сделать другой адаптер, и все. Изменения с точки зрения кода, который использует нужный нам интерфейс, будут только в используемом адаптере.

    За счет этого достигается независимость.

    Что значит "принимает зависимость"?


    Предположим у нас есть метод для смены пароля юзера. Что бы это безопасно провернуть, нам надо пароль захэшировать и хранить в захэшированном виде. То есть нам нужна какая-то штука, которая будет эти пароли хэшировать. Мы о ней знать ничего не хотим, хотим что б нам ее давали:

    public function changePassword(string $password, PasswordEncoder $encoder)
    {
        $this->password = $encoder->encode($password);      
    }


    Это зависимость нашего метода. Он зависит от него. Диалог между объектами можно представить себе такой:

    - Слыш, поменяй пароль на этот
    - Оке, только хэшер паролей мне дай, мне очень надо
    - А какой тебе?
    - Да любой с этим типом
    - Ну ок. На вот пароль и хэшер. Делай дела.

    Что такое вообще эта зависимость?


    Зависимости - это все что мы используем чтобы сделать дела. Это не только библиотечки, но и просто классы, функци и т.д. Весь "сторонний" код с точки зрения нашего кода. И самое важное в том, что "нашим" кодом является тот, над которым мы работаем в данный момент времени, а не все что мы написали. Даже функции, которые есть в языке программирования из коробки являются зависимостями. Вот только от них вам не деться никуда особо, а потому с ними замарачиваться не стоит. Или если есть долговременная поддержка у библиотеки и она устаялась - тоже можно просто использовать. А вот если это поделка на гитхабе с 10-ю звездочками и там до сих пор нет ни одного релиза - но она вам вот очень нужна, возможные поломки в ней (а они рано или поздно будут) стоит "закрыть" адаптером что бы потом поменять на что-то получше или обновить без боли.
    Ответ написан
    Комментировать
  • Как конвертировать HTML в PDF?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    wkhtmltopdf, phantomjs
    Ответ написан
    Комментировать
  • Какой чпу быстрее?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    смотря какого рода маршрутизация. В целом же это такая экономия на спичках (подозреваю что nginx будет чуть быстрее, но это будет сказываться вообще на все запросы к nginx а не только на те что к php) что можно смело забить и выбирать максимально удобный вариант. Пых скейлится лучше.
    Ответ написан
  • Как удалить запись с внешними ключами в MySQL, используя Doctrine ORM?

    banderos120
    @banderos120
    Играю на балалайке
    /* @ORM\JoinColumn(name="application_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") */

    Т.е. поставьте /* onDelete="SET NULL" */
    И не забудьте сделать doctrine:schema:update
    Ответ написан
    5 комментариев
  • Как выбирать название для CSS-классов?

    paulradzkov
    @paulradzkov
    Дизайнер, верстальщик, начальник отдела UI
    То, КАК оно это описывает. Паттерн поведения.

    Название класса должно быть достаточно абстрактным, чтобы его можно было переиспользовать и оно при этом не смотрелось чужеродно.

    В статье css-live.ru/articles/o-semantike-html-i-arxitektur... есть хорошие примеры.

    Оригинал этой статьи — nicolasgallagher.com/about-html-semantics-front-en...
    Ответ написан
    Комментировать
  • Объясните поведение MySQL, связанное с ORDER BY и LIMIT

    Finesse
    @Finesse
    Одно из основных положений теории баз данных гласит, что если не задана сортировка, то данные могут выдаваться в абсолютно любом порядке. У вас сортировка идёт по полю, для которого значение всех записей совпадает, и данные не сортируются.

    Чтобы этого избежать, добавьте ещё одну сортировку по первичному ключу или любому другому полю с уникальными значениями, например (не знаю названия ключевого поля в вашей таблице, замените `id` на него):
    SELECT * 
    FROM  `products`
    ORDER BY `position` DESC, `id` ASC
    LIMIT 800 , 38
    Ответ написан
    Комментировать