Статьи

Настройка 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 Blog - блог о веб разработке

Итак, в первую очередь нам понадобится платформа для установки 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). Хотя в сети еще куча сборок:

  1. Денвер
  2. xampp
  3. Собрать свою =)

Теперь стоит сказать о трех способах установки библиотек symfony.

Печать страниц сайта под управлением symfony

Предоставлено Symfony Blog - блог о веб разработке

 

Наверняка кто-то из программистов недоумевает, что происходит с их сайтом при попытке печати под управлением 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('...');