morontt.info

NewsНовая админка

Спустя кучу лет привёл до работоспособного состояния и запустил третью версию движка этого бложика. Вернее, это только его часть, админка. Предыдущая торжественная заливка была почти 4 года назад :) Собственно, эту запись из неё первую и пишу.

Технически залитая часть сайта представляет из себя SPA (single page application) на Ember.js и REST API на PHP фреймворке Symfony2. Исходники доступны на гитхабе, так что можете изучать и ломать это приложение полностью.

Реализованы, конечно, не все задумки, но новая версия уже умеет больше, чем предыдущая. И можно будет уже начинать потихоньку писать новый фронтенд на чём-нибудь интересном.

Symfony2Symfony2 и Ember.js

Внимание, данная запись устарела. Работоспособность модуля ember-precompile под вопросом начиная с Emberjs 1.9, в связи с переходом на handlebars 2.0.0, а с версии эмбера 1.10+ шаблоны рендерятся с помощью HTMLBars, об этом напишу в ближайшее время.

Эту тему, конечно, в двух словах не опишешь, но попробую. Что это такое и с чем его едят - рассказывать не буду, т.к. раз уж вы сюда попали, то слова эти для вас не пустой звук. Расписывать, почему именно Symfony2 и Ember.js - тоже. Просто так сложилось. Ладно, вступление окончено.

Ember.js и Symfony2

В данной записи будет затронута только серверная часть, хотя не исключено, что когда-нибудь дойдут руки и до статеек по эмберу. Собственно, Symfony-приложение предоставит яваскриптовому приложению REST API, а так же неким образом "подготовит" его и выдаст клиенту в браузер.

Symfony2Twig, интернационализация даты

Иногда возникает потребность выводить дату в таком формате, когда месяц написан текстом, но при этом сайт многоязычный. Месяц, естественно, тоже должен соответствовать выбранной локали. Вот тут и возникает загвоздка, поскольку php-шная функция date выведет месяца на английском. Какой-нибудь крутокодер Вова Теплов создал бы массивчик с переведёнными месяцами и прошёлся бы простой заменой, поскольку некогда разбираться, надо делать тикеты. Но это не наш путь. Языков на сайте может оказаться пять штук, один из которых, допустим, арабский/корейский. Да и сами языки могут добавляться на сайт в будущем.

twig localized date

В общем, задача эта типовая и не надо ничего придумывать. Решение имеется уже готовое → IntlDateFormatter. Но решать эту задачу я буду в контексте Symfony 2.

Doctrine 2Падение производительности при импорте данных

Не в первом проекте уже сталкиваюсь с ситуацией, когда при импорте данных при помощи ORM Doctrine 2 происходит падение производительности с увеличением количества импортируемых данных. Вот и сейчас проявилась данная особенность, а заодно и обнаружилось решение, которым спешу поделиться :)

Небольшое вступление. Переписываю один сайт с некой CMS на более-менее человеческий фреймворк, а заодно разбираю ту кашу, которая образовалась внутри базы данных (из-за того, что прежним разработчикам неоднократно приходилось прикручивать функционал, на который CMS-ка, естественно, не была рассчитана изначально). Пишу определённые SQL-запросы, которые вытягивают информацию в нужной мне форме из старой БД и складывают её в CSV-файлы, из которых впоследствии эти же данные переносятся доктриной в новую БД.

На последнем этапе как раз и наблюдается неприятное явление. Первые порции данных в цикле импортируются быстро, а потом становится заметно, что скорость всё падает и падает.

Вывешу скриншот из серии БЫЛО и СТАЛО, остальное под катом...

Результат метода clear

Doctrine 2Пользовательские функции DQL

Допустим, что вы используете ORM Doctrine 2 и что вам необходимо выбрать из базы некие записи, но не просто так, а по хитрому. Выборка должна осуществляться по хешу какого-то поля, значение в котором вы не хотите никому показывать из соображений безопасности. Пример, возможно, и надуманный, но не в этом суть... Короче говоря, нужно реализовать подобный запрос:

SELECT * FROM `spam` AS `s`
WHERE MD5(`s`.`secretfield`) = 'hash';

Дальнейшие действия хоть и касаются DQL и Doctrine, но будут описаны в контексте фреймворка Symfony 2. Оригинальную статью можно обнаружить в документации

user-defined-functions

ТестированиеАвтоматизированное тестирование

Это вторая запись из серии, посвящённой тестам, первая находится тут. В ней будет описан процесс установки и настройки функционального тестирования в Symfony2 с использованием Behat и Mink

Для начала, наверное, стоит рассказать о том, что такое эти Behat и Mink, и с чем их едят. Первое - это библиотека, которая интерпретирует человеко-понятные сценарии и, собственно, выполняет их в виде тестов. Второе - это абстрактная библиотека эмулятора браузера, которая содержит множество готовых определений, используемых Behat-ом при разборе тестовых сценариев, характерных именно для общих задач браузера. Помимо этих специфических определений, Mink предоставляет объектно-ориентированных интерфейс, позволяющий общаться с браузером. Сложно, конечно, описать это в двух словах, нужно самому посмотреть и пощупать :)

Сперва создадим пустой проект или же будем считать, что он уже существует. Я не стал особо заморачивать себе голову и скачал с офсайта Symfony Standard 2.1.7 without vendors. Установкой всех необходимых библиотек будет заниматься composer, а запускается сей процесс (установки) буквально одним взмахом левой пятки.

php composer.phar install

Ну а теперь займёмся настройкой проекта для тестирования. В первую очередь подправим файл composer.json, добавив в него следующие штуки:

PHPЛокальные проблемы PHP

Подключился на днях к новому проекту на Symfony 2 и начались проблемы :) Проблемы не с симфонией, конечно, а с php, точнее, с его настройками. Скачал проект, установил внешние библиотеки и буквально с первой команды наблюдаю такую красоту в терминале.

warning date_default_timezone_get

NewsSymfony Camp 2012

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

Symfony Camp 2012

На снимке Kirill Chebunin — Rich model and layered architecture in Symfony2 application