Проблема з capifony

Якщо в вас виникла схожа трабла

cap deploy
/home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:191:in `find_file_in_load_path': no such file to load --  (LoadError)
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:179:in `load_from_file'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:89:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `block in load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `each'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `load'
	from Capfile:3:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:93:in `instance_eval'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:93:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:180:in `load_from_file'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:89:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `block in load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `each'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:65:in `block in load_recipes'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:65:in `each'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:65:in `load_recipes'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:31:in `execute!'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:14:in `execute'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/bin/cap:4:in `'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/bin/cap:23:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/bin/cap:23:in `

‘ from /home/stfalcon/.rvm/gems/ruby-2.1.1/bin/ruby_executable_hooks:15:in `eval’ from /home/stfalcon/.rvm/gems/ruby-2.1.1/bin/ruby_executable_hooks:15:in `
Тоді вам треба перегенерувати Capfile

$ rm ./Capfile 
$ capifony .

PS. Тепер буду вести цей блог виключно українською або англійською.

Заметка по VichUploaderBundle

Долго мы мудохались (по другому не скажу) с парой-тройкой багов, которые полезли в результате использования VichUploaderBundle. И главное мы к ним возвращались по 2-3 раза на разных проектах за последние полгода :).

Symfony’s form component cleanup

Наименее костыльное решение предложили здесь. Чтобы постоянно не прописывать data_class в формах я добавил его в DefaultOptions для FileType и отправил PR в Symfony2. Чуть позже доделаем тесты и думаю PR примут.

The file is not updated if there are not other changes in the entity

Это хитрый баг, который возникает когда в форме меняется только файл. Словили его когда решили обновить логотип для спонсора на http://fwdays.com. Сегодня я выделил время на дебаг и понял, что нормальным путем проблему не решить. Смотрите сами:

...
 
// биндим данные на форму
// - запускаем дата трансформеры
// - дергаем сеттеры сущности (setFile и др.)
$form->bind($request);
 
// валидируем форму
// в $file должен быть объект загружаемого файла (UploadableField), чтобы пройти валидацию
if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();
 
    // готовим сущность к сохранению в БД
    // вычисляется хеш объекта и определяется его состояние (новый, обновленный и т.д.)
    // здесь дергается хук preUpdate (обновление) или prePersist (новая сущность) и файл физически перемещается в место назначения, но 
    // !! если нужно просто обновить файл, то проблема т.к. имя файла (которое хранится в БД) ещё не изменилось, а preUpdate запускается только если в сущности есть изменения !!
    $em->persist($entity);
 
    // сохранение данных
    $em->flush();
 
...

Получается, что нужно зааплоадить новый файл и засетить его имя в сущность до того как отправить сущность в persist() менеджера сущностей. Иначе Doctrine не видит изменений в сущности, не дергает хук preUpdate и аплоад средствами VichUploaderBundle не происходит :(.

Спасает костыль от автора бандла, который предлагает делать в сущности поле updatetAt и обновлять его если в сеттер файла приходит что-то новенькое:

public function setFile($file)
{
    $this->file = $file;
 
    if ($file instanceof UploadedFile) {
        $this->setUpdatedAt(new \DateTime());
    }
}

Как-то так 🙂

Debian & “Transport endpoint is not connected”

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

Если работа системы была завершена некорректно, то в системе остается файл блокировки mongodb “/var/lib/mongodb/mongod.lock”.

Логично, что для возобновления нормальной работы его нужно удалять и заново стартовать монгу.

sudo rm /var/lib/mongodb/mongod.lock; sudo service mongodb start

Ubuntu, KnpConsoleAutocompleteBundle и php 5.3.10

Есть такой клёвый бандл KnpConsoleAutocompleteBundle от KnpLabs, суть которого заключается в автоподстановке команд для скрипта консоли Symfony2.

Т.е. набираешь “./app/console doc” жмешь [Tab] и получаешь “./console doctrine:”. Жмешь [Tab] ещё два раза и получаешь все варианты комманд:

$ ./app/console doctrine:
doctrine:cache:clear-metadata        doctrine:generate:form
doctrine:cache:clear-query           doctrine:mapping:convert
doctrine:cache:clear-result          doctrine:mapping:import
doctrine:database:create             doctrine:mapping:info
doctrine:database:drop               doctrine:query:dql
doctrine:ensure-production-settings  doctrine:query:sql
doctrine:generate:crud               doctrine:schema:create
doctrine:generate:entities           doctrine:schema:drop
doctrine:generate:entity             doctrine:schema:update

Вобщем удобно очень :).

Одна проблема — не работает под Ubuntu )). Есть даже тикет соотвествующий от Люиса Кордовы “does not work on ubuntu debian“. В тексте issue он дает ссылку на translate моей темы “проблема с ConsoleAutocompleteBundle” с форума zf.ru.

Так к чему я это пишу? Прошел почти год с того момента как я столкнулся с этой проблемой. Ну, думаю, должны были за это время все разрулить и баг пофиксить. Разворачиваю тестовое приложение, настраиваю, ставлю бандл, настраиваю, пробую автокомплит и разочаровываюсь — проблема осталась (((.

Показал ссылку на обсуждение бага Жене (наш админ) и он посоветовал мне установить php 5.3.10 с ppa. И вот когда я его поставил, то все заработало! Ура 🙂

PS. На всякий случаю запишу, что ставил я его вот так:

$ sudo add-apt-repository ppa:nginx/php5.3
$ sudo aptitude update
$ sudo aptitude upgrade --full-resolver

Несколько шпаргалок по Symfony2

Нашел на задворках своего HDD несколько шпаргалок по Symfony2. Лучше выложу их сюда, а то когда нужно, то фиг найдешь. Думаю, что они будут многим полезны.

Путь HTTP запроса в Symfony2 (jpg)


Автор Benjamin Dulau

Как работают формы в Symfony2 (pdf)


Автор Andréia Bohner

Symfony2. На чем можно сэкономить время при разработке?

Слайды моей презентации с Symfony Camp.

В целом кемп удался. Правда в прошлом году мне было намного интересней т.к. с symfony я ещё вобще не работал и объем новой информации был просто огромный. Именно тогда я впервые услышал такие слова как haml, less, twig, capistrano, hudson.. А сейчас мы используем в своей работе больше половины из этих вещей :).

На сегодняшнем кемпе мне больше всего понравился доклад Кирилла Чебунина (Чебы) “Symfony2 Service Container: Inject me, my friend” — я не копался в DI контейнере Symfony2 настолько глубоко и услышал новые для себя вещи.

На втором месте, пожалуй, был доклад Миши Бондарчука (Даверта) “TestGuy – эмулируем вашего тестировщика на PHP” — о этой разработке знаю довольно давно и очень хотелось посмотреть как же оно выглядит в реале.

Доклады Игоря Бровченка и Саши Демченка, тоже были довольно интересны людям, которые не работали с twig и redis. Мои ребята говорили, что им понравилось.

Вобщем ещё раз спасибо Игорю и Саше за организацию. Ждем следующий Symfony Camp ;).

ps. Кстати у нас (Frameworks Days) есть мысль провести весной 2012 “Symfony2 Framework Day”. Ивент сделать платным и пригласить на него несколько зарубежных докладчиков. Костя Кудряшов порекомендовал Ryan Weaver. Саша Демченко говорил, что Fabien Potencier готов был приехать на Symfony Camp, если бы ему оплатили расходы. Что вы об этом думаете? Думаю было бы круто.

#4й дайджест материалов по Symfony2

Как-то затянулся у меня 4й дайджест материалов. Уже и релиз Symfony2 состоялся, а я все никак не могу к добраться к публикации :).

Блоги посвященные Symfony2

Рекомендую подписаться на RSS лету блога — http://www.craftitonline.com/. Льюис контрибютит Symfony2 и часто выкладывает новые материалы.

Буквально вот только что наткнулся на интересный блог @qpleple, на котором есть серия хороших статей:

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

На блоге http://webb-on-the-web.com/ Роджер Вебб написал всего пару статей, но обе на тему Symfony2. Итак:

Отдельные материалы на тему Symfony2

Symfony2: Checking Coding Standards — о том как проверять стандарты кодирования Symfony2 используя PHP_CodeSniffer. Сразу описана интеграция в Phing и Jenkins (Hudson).
И тут же в комментариях Кирилл Чебунин поделился линком на инфу о том, как это можно прикрутить к NetBeans — Coding Standards in NetBeans IDE with PHP CodeSniffer.

Symfony2 and DoctrineExtensions — о том как подключать Timestable, Sluggable, etc. Все довольно просто подключается и относительно хорошо работает.

Adding non-entity fields to your Symfony2 forms — название опять же говорит само за себя. К примеру, это можно использовать для форм в которых есть поле апдлоада.

Behat turns 2! Have fun and test what — Behat2 стал ещё лучше :). Либа довольно интересная и в хозяйстве полезная. Сейчас уже доступна версия 2.1.2.

Установка и настройка функционального тестирования в Symfony2 с помощью Behat и Mink — заметка на Хабре после которой я решил все таки попробовать Behat на живом проекте.

Использование Zend GData в Symfony2-проекте
— ещё одна заметка на Хабре, но уже на другую тему. Я с Gdata пока не работал. Вы работали? Для каких задач?

Symfony2\SecurityBundle — перевод «Symfony2 Blog Application Tutorial Part V: Intro to Security». Стоит прочитать.

Все

Если дочитали до этого места, то отпишитесь в комментариях. Давайте обсудим материалы или так про жизнь потрещим. Скучно без комментов то (:

Кстати на Symfony Camp идете? 29го октября я буду выступать там с докладом “Symfony2. На чем можно сэкономить время при разработке?“. Прошлогодний кемп мне очень понравился.

Третий дайджест материалов по Symfony2

@Spoil_me_easy: Хочу напомнить: вы просрали уже 25 дней лета. У вас ещё 67. Удачи.

Новости

Вчера вышел первый релиз кандидат Symfony2. Т.е. не за горами релиз первой стабильной версии Symfony2, а значит его потихоньку можно использовать для реализации коммерческих проектов. УРА!

Начал работу PEAR канал Symfony2. На нем доступны отдельные компоненты фреймворка. Если вы используете эти компоненты в нескольких проектах, тогда жизнь станет чуточку проще ;).

В Symfony2 появился интерактивный генератор бандлов, который может сильно облегчить жизнь на начальных стадиях разработки проекта. Посмотрите видео — это магия :).

UPD. Совсем вылетело из головы! С недавнего времени mailing лист по симфони разделили на отдельные mailing листы для первой и для второй версии фреймворка.

Полезные ресурсы

Почитайте блог Ричарда Миллера — за относительно небольшой промежуток времени он успел написать довольно много интересных статей. К примеру, “Symfony2: Moving Away From the Base Controller” — руководство о том как избавиться от наследования базового контроллера и сделать контроллер отдельным сервисом. Использовать почерпнутые из статьи знания следует с умом. Например, Фабьен Потенсьер негативно высказывается о таком подходе.
Continue reading

BlogBundle для Symfony2

После реализации PortfolioBundle, я решил сделать простенький бандл для блога.

Вот что в нем реализовано на данный момент:

  • CRUD записей
  • Подключен редактор разметки markItUp!
  • Реализована подсветка исходного кода в тексте при помощи GeSHi
  • Для создания/редактирования тегов записи написан отдельный тип формы и преобразователь данных
  • Генерация RSS ленты записей при помощи \Zend\Feed (ZF2)
  • Модели и контроллеры покрыты тестами

Ниже я остановлюсь на некоторых моментах более детально.
Continue reading

Бандл для подключения TinyMCE к Symfony2

Дай, думаю, черкну несколько строк о том чем я занимаюсь, а то тишина в блоге :).

Недавно создал простенький бандл для подключения TinyMCE к Symfony2 проектам. Называется он TinymceBundle и лежит на гитхабе.
Continue reading