Блог хеллоуворлдщика

Категория [PHP]


Экранирование спец-символов в LIKE

Как правило ни одна ORM не умеет экранировать спец-символы в LIKE и разработчик должен об этом позаботиться сам. Опасного в том, что вы забудете это сделать, или не делали по какой-то другой причине, нет. Пользователь лишь будет находить записи, которые совсем не ожидал увидеть.

Читать далее

Еще один MVC пример для PHP

Начнем, пожалуй, с того, что MVC как такового в PHP нет в виду невозможности реализации. Правда, эта информация может лишь понадобится на собеседовании или общении между разработчиками, чем для реальной жизни. В повседневности для вас будет стоять задача не смешивать бизнес-логику и представление. А каким именно шаблоном вы будете пользоваться не так важно.

Надеюсь, вы уже ознакомились с какой-либо информацией касательно MVC или какой-то информацией для отделения бизнес-логики от представления и т.п. Возможно, прочитали, что все приложения состоят из этих трех частей. Хотя на самом деле это не совсем так. MVC необходим только для взаимодействия с пользовательским интерфейсом (UI), чтобы бизнес-логика не проникала в представление, а представление в бизнес-логику, и больше ни для чего. Помимо шаблона MVC в приложениях, как правило, используется еще множество других шаблонов проектирования, а вся бизнес-логика находится не в модели. Модель лишь транспортирует данные и служит связующим звеном с представлением.

Самое главное, по моему мнению, в изучении парадигм вида MVC, MVP, MVVP/etc и любых других шаблонов.: не пытаться ограничивать себя в реализации. Самого правильного варианта не существует, есть лишь общая модель, идея. А как это называется не особо важно. Не стоит сжимать себя до терминов и определений.

Читать далее

Внешний + первичный ключ в Doctrine ORM

Иногда встает необходимость использовать первичный ключ таблицы как связь к другой таблице. От некоторых людей я слышал, что в Doctrine ORM такое сделать невозможно и приходиться иметь обязательно инкрементный первичный ключ. На самом деле, это необязательно и возможность совмещать первичный ключ с внешним у Doctrine ORM имеется из коробки с версии 2.1. Для этого нам нужен атрибут association-key (для XML; или associationKey для YAML).

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

Читать далее

Библиотека для работы с Nested Set в Doctrine ORM

Опубликовал библиотеку, которая помогает работать с Nested Set Tree. Пока что не реализован весь функционал, но можно уже пользоваться тем, что есть. Постепенно буду его добавлять и улучшать.

Ссылка на репозиторий: https://github.com/bupy7/doctrine-nested-set

Читать далее

Многоязычность или мультиязычность в PHP

Многие сталкиваются с такой проблемой, как поиск подходящего решения в решение вопроса с мультиязычностью и переводами в целом. Мало кто знает, но в PHP есть такое расширение Intl, которое из коробки поддерживает различные фичи связанные с переводами, форматированием и прочими плюхами полезными не только для мультиязычных проектов, но и одноязычных тоже. Все это называется - интернационализация. И сегодня я хочу осветить такой вовсе не странный и весьма простой вопрос с переводами. Дак, как же все-таки сделать это просто, быстро и безболезненно? Читайте дальше! =)

Читать далее

SELECT COUNT(*) FROM (sub_query) в Doctrine 2

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

Если у вас сложный запрос и вам нужно получить по нему COUNT(*), то в сети можно найти вариант вида:

$subQuery = $qb->select('main.id')
    ->from('Order\Entity\Order', 'main')
    ->where('main.published = :published')
    ->setParameters([
        'published' => true,
    ]);
 
$qb->select('COUNT(o)')
    ->from('Order\Entity\Order', 'o')
    ->where($qb->expr()->in('o.id', $subQuery->getDQL()))
    ->setParameters($subQuery->getParameters());
 
return $qb->getQuery()->getResult();

Но такой запрос очень медленный. Он подойдет для незначительного объема данных.

Читать далее

Изолированный запуск тестов Codeception

Изолированный запуск тестов Codeception

Данное решение подойдет только для тех, кто разбил тесты на модули, а не тестирует сразу весь проект.

Когда ваш проект большой и все ООП, то это кушает много памяти. А вы еще, как на зло, заюзали некогда очень популярный среди разработчиков на PHP - Codeception. Я не буду здесь критиковать Codeception, личный выбор каждого, но, ИМХО, если встанет выбор между Codeception и PHPUnit, то выбирайте второе. ;) Но, здесь мы собрались по другой причине...

Причина написания данной статьи является выход таймаута или переполнение памяти при запуске тестов, что никак не решается в Codeception из коробки, но прекрасно решается в PHPUnit.

Но, все решаемо и я поделюсь с вами небольшим куском кода, который вы можете доработать, или использовать, как есть.

Читать далее

Генератор HTML форм или HTML Builder для PHP

Генератор HTML форм или HTML Builder для PHP

Все full stack девелоперы вынуждены/любят (нужное подчеркнуть) работать с фронтом. И там, где на проекте отсутствует фронт отдельным приложением мы используем html билдеры. Как правило, каждый фреймворк оснащен своим билдером, но иногда этот билдер может оказаться не таким функциональным или удобным, как хотелось. А иногда и вовсе отсутствует. И здесь, как всегда, я натыкаюсь на "необходимость".

Build Status Coverage Status

Читать далее

XML конструктор

Понадобилось создать запрос в формате application/xml/text/xml? Или создать sitemap.xml? И ты в поисках обертки над XMLWriter? Тогда, ты её уже нашел!

Данная обертка позволяет создать XML файл из массива без особой возни и скромной затратой времени.

Build Status Coverage Status

Ссылка на GitHub: https://github.com/bupy7/xml-constructor

Читать далее