Статьи
Настройка PostgreSql в Symfony 1.4
Основные настройки для соединения с СУБД указываются в config/databases.yml:
all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: pgsql:host=localhost;dbname=project_name
username: root
password: password
Основная строчка тут: dsn: pgsql:host=localhost;dbname=project_name
Если у вас появилось сообщение: Couldn’t locate driver named pgsql тогда необходимо подключить pdo_pgsql в php.ini
extension=php_pdo_pgsql.dll
Введение в Symfony Framework основы
Symfony — это один из тех фреймворков на PHP5, который привлекает своей достаточной документацией, множеством плагинов, обновлениями, анонсами новых версий и многим другим. имхо тут нечего больше добавить.
Введение
Сразу хочу отметить, что статья не тянет на учебное пособие или руководсво для новичков в PHP, потому что фреймворк досточно сложный, но интересный (: Как говориться, путь осилит идущий.
Валидация Email с проверкой MX-записи домена
Используя symfony с ORM Doctrine, возникла необходимость проверки e-mail'a в форме, но обычного sfValidatorEmail не достаточно, т.к. если в модели данных Doctrine поле email объявлено с валидатором «email: true» оно проверяется самой Doctrine на наличие MX-записи домена и если ее нет — выбрасывает эксепшн. Согласитесь, это не красиво(: Пользователь вводит регистрационные данные и фейковый почтовый адрес, удовлетворяющий шаблону, и получает в ответ «500 Inernal Server Error». Для корректной обработки фейковых адресов я сделал свой валидатор sfValidatorEmailMx, который наследует стандартный валидатор sfValidatorEmail добавляя проверку MX-записи домена, если записей нет — вызыдает ошибку «mx_error» и именем домена в поле %domain%. Код валидатора (lib/validator/sfValidatorEmailMx.class.php):
Антипаттерны Symfony
Антипаттерны Symfony
Я не очень люблю слово «антипаттерны», так же как и «паттерны». По мне, это чересчур заумные слова для обозначения довольно простых по своей сути идей. И тем не менее, ниже я намереваюсь поведать о самых частых антипаттернах при использовании PHP-фреймворка Symfony (версий 1.2 и 1.3/1.4). То есть о том, как программировать по-хорошему бы не надо, но по незнанию либо лени как-то само получается.
Все ниженаписанное навеяно примерно полугодовым опытом работы в веб-студии, активно использующей Symfony для всех проектов с 2008 года.
Осторожно, многабукав. Пост про быдлокодерство, кому неинтересно, можете смело пропускать :)
Symfony 1.2: решение проблемы загрузки flv файлов в админке
В Symfony есть одна неприятная проблемка. Если попытаться залить файлы .flv в админке, то после того как файл запишется на диск, мы получим расширение файла в виде: .exe и .obj, . В предыдущей версии Symfony 1.1 это решалось перекрытием методов в actions.class.php, и исправлениями других файлов. Конечно проблему это решило, но её реализация была так себе. В новой версии решил написать по другому и получилось все очень просто. Почему так происходит? При загрузке .flv файлов они определяться как application/octet-stream, а в Symfony это как раз тип файлов .exe. Поэтому создаем свой myValidatorFile, который наследует sfValidatorFile и решает проблему.
Установка symfony
Итак, в первую очередь нам понадобится платформа для установки symfony, а именно: сервер Apache, сервер БД вроде MySQL, SQLite и интерпретатор PHP версии 5.2.4 или более новый. При установке на платформу Windows наиболее удобным для разработки, на мой взгляд, является уже собранный сервер WAMP (www.wampserver.com/en/). Скачиваем его и устанавливаем. Стоит внести путь к бинарнику php в переменные окружения. Для этого в свойствах системы в закладке “Дополнительно” нужно открыть “Переменные среды”. В переменную Path дописать, через точку с запятой, путь к файлу php.exe например C:\wamp\bin\php\php5.2.9-1\php.exe). Хотя в сети еще куча сборок:
- Денвер
- xampp
- Собрать свою =)
Теперь стоит сказать о трех способах установки библиотек symfony.
Печать страниц сайта под управлением symfony
Наверняка кто-то из программистов недоумевает, что происходит с их сайтом при попытке печати под управлением symfony. Верстка разъезжается в разные стороны, а стили вроде бы подключены. В чем же дело? Я сам ломал голову пару часов до тех пор, пока не посмотрел сорс страницы и не увидел что symfony автоматически добавляет атрибут media.
Используем symfony вне проекта
Для того чтобы использовать функции симфони вне проекта нам необходимо подключить классы сифони:
require_once 'путь_до_библиотек/lib/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();
Дальше уже можем читать данные из yml:
Шпаргалки по симфони
Наверно, у каждого разработчика есть свой список шпор, хочу поделиться своим списком. Как получить Параметр Запроса Напрямую из Шаблона
get('name') ?>
Проверка Существования Параметра Запроса в Шаблоне
has('name')): ?>
Hello, get('name') ?>!
Hello, John Doe!
Очистить кэш для другого application из action в Symfony
Решение:
sfContext::switchTo('frontend'); //переключение на application в котором надо очистиь кэш
sfContext::getInstance()->getViewCacheManager()->getCache()->clean(sfCache::ALL);
sfContext::switchTo('backend'); // переключение обратно
Отличие renderPartial от getPartial в Symfony
Исходный код обоих методов
// sfAction.class.php
public function renderPartial($templateName, $vars = null)
{
return $this->renderText($this->getPartial($templateName, $vars));
}
...
...
public function getPartial($templateName, $vars = null)
{
$this->getContext()->getConfiguration()->loadHelpers('Partial');
$vars = !is_null($vars) ? $vars : $this->varHolder->getAll();
return get_partial($templateName, $vars);
}
Symfony не очищает переменные в сессии, когда истекло её время жизни
Когда пользователь логиниться, обычно в сессию добавляются какие-то параметры, например имя, фамилия, всё что угодно, делается это так:
#apps/frontend/lib/myUser.class.php
...
public function authenticate($user = null)
{
$this->setAuthenticated(true);
$this->setAttribute('username', $user->getUsername());
...
}
...
Настройка шаблонов для 500 ошибки и unavailable
Эти страницы не находятся в дефолтном модуле, так как они вызываются, когда symfony срабатывает не так как задумано. Эти шаблоны можно найти в $sf_symfony_lib_dir/exception/data/ директории:
- error.html.php: страничка вываливается, когда на сервере происходит внутренняя ошибка в продакш моде, в других модах(enviroment), где флаг debug стоит в true, вываливается exception c полным стеком вызовов и указанием ошибки
- unavailable.php: страничка вываливается, когда юзер запрашивает страницу в то время как ваш сайт disabled (при помощи disabled task: "php symfony project:disable application env"), короче находится в спячке (under construction). А так же эта страница появляется, когда происходит очистка кэша (php symfony cc). То есть в промежуток времени, когда вы запустили task и до его окончания. На крупных сайтах кэш может быть большим и его чистка порой занимает несколько секунд. Symfony не обрабатывает запрос при частично очищенном кэше, поэтому запросы, пришедшие до окончания очистки кэша, будут отправлены на эту страницу .
Чтобы кастомизировать эти страницы, просто создайте директорию error в config директории всего вашего проекта или отдельно для каждого application. Либо тут my_project/config/error, либо my_project/apps/frontend/config/error. Создайте в этой папке файлы error.html.php и unavailable.php - symfony будет использовать их, вместо своих.
Настройка собственного действия и шаблона ошибки 404
Необходимо активировать error_404_module и error_404_action в конфигурационном файле settings.yml
# apps/frontend/config/settings.yml
all:
.actions:
error_404_module: error # Необходимо указать ваш модуль
error_404_action: 404 # и действие
Как получить доступ к перменным сессии пользователя в form классах
К примеру вот так:
# lib/form/YourForm.class.php
sfContext::getInstance()->getUser()->->getAttribute('...');