Около 2х месяцев назад я начал изучать фреймворк Symfony2. Просто хотелось посмотреть что-то новое, разобраться с Doctrine2 и перейти на php 5.3.
В результате получился небольшой учебный проект, на базе которого я планирую наконец доделать портфолио студии.
Начало работы с Symfony2
Для начала работы с Symfony2 советую скачать sandbox и почитать Quick Tour.
Документация к фреймворку пока в процессе написания, но это лучше чем ничего. Часть документации уже переведена на русский язык. Кстати вы можете помочь перевести остальную часть.
Доступны два сайта, которые агрегируют информацию о бандлах и проектах на Symfony2. Это http://symfony2bundles.org и http://symfohub.com/bundles.
Конец первого поста о Symfony2
На этом пока все. Удачи 😉
І як воно в порівнянні з Zend Framework?
Symfony сам пробував але проектів не писав тому цікаво як воно на практиці.
поки важко сказати. точно скажу, що швидше працює і просить менше пам’яті.
часу на розробку йде набагато більше. деколи через баги, а інший раз просто не вистачає документації і прикладів. це ще не стейбл.
також в мене досвіду розробки на ZF значно більше ніж на Symfony2.
А почему именно Symfony2, а не скажем Yii? Yii мне кажется более привлекательным для изучение и возможного перехода, чем Symfony2.
да ну. по-моему ты сравнил хрен с пальцем 🙂
если бы не Symfony2, то я на RoR думал переключиться.
Ну Yii сейчас вроде хорошими темпами развивается. И поддержка у него шустрая)
даже если брать темпы развития как основной критерий, то я все равно не вижу с этим проблем у symfony2 https://github.com/symfony/symfony/commits/master/
я не говорю, что Yii плохой т.к. не могу судить о инструменте который не использовал. наоборот слышал о нем много хороших отзывов.
но ИМХО весовые категории у Yii и Symfony разные.
в документации: github.com/stfalcon/portfolio/blob/master/README.md
написано – bin/vendors.sh
по факту там bin/vendors.php, а в нем еще и ошибка в 22 строке, лишняя кавычка
system(‘rm -rf ‘ . $vendorDir’);
а под конец инсталяции вывалилась ошибка
PHP Fatal error: Class ‘Stfalcon\Bundle\BlogBundle\StfalconBlogBundle’ not found in /var/www/portfolio/app/AppKernel.php on line 46
спасибо за замечания!
vendors.sh на vendors.php я заменил вчера и README ещё не успел обновить. только что все поправил
Тебе спасибо что делишься таким полезным проектом! 🙂
Включи еще в описание, что после клонирования надо сделать
git submodule init
git submodule update
иначе во время $ php bin/vendors.php все равно получаем ошибку
PHP Fatal error: Class ‘Stfalcon\Bundle\BlogBundle\StfalconBlogBundle’ not found in /var/www/portfolio/app/AppKernel.php on line 48
ну и в конце не помешает сделать
$ app/console doctrine:fixtures:load
и все работает 🙂
ну и остается выяснить вопрос с сохнанием рисунков, в модели у тебя такой алгоритм
public function getPathToUploads()
{
return realpath(__DIR__ . ‘/../Resources/public/uploads/projects’);
}
что дает путь:
/var/www/portfolio/src/Application/PortfolioBundle/Resources/public/uploads/projects
а в скрипте картинка выводится как
/bundles/portfolio/uploads/projects/4ddaf54c092f5.png
я сделал
$ mkdir bundles
$ cd bundles
$ ln -fs /var/www/portfolio/src/Application/PortfolioBundle/Resources/public/ portfolio
картинки показались, но правильно ли это?
касательно первой части. я вчера опять немного поменял структуру. буду благодарен если запушишь правки ридми.
по картинкам. нужно сделать “./app/console assets:install –symlink web” из корня проекта. его запуск прописан в vendors.php, но бандл блога все похерил 🙂
Все таки зря ты на ROR не переключился, я смотрю эту презетацию и думаю до чего же php всетаки не web по сравнению с ruby(Я с zend framework[1,5 года опыта] прыгнул на ROR). Глянь хотя бы скринкасты http://railscasts.com/ и ты поймешь что тебе нужно в 4 раза меньше кода чтобы выразить свои мысли на рельсах. И как вытекающее отсюда в 4-10 раза меньше времени, лучше тестами покрыть за это же время проект. Принципиальное отличие в том что рельсы абстрагируются от задач а не от кода: например тебе надо сделать на сайте регистрацию, конфирмацию, авторизацию, восстановление пароля – пожалуйста 2 команды в консоле и готово, осталось только форму кастомизировать. Надо аплоад картинок? 1 команда с консоли + указываешь как тебе резать типа 300×300>(соблюдая пропорции) 200×200 и готово. Надо вывести каменты рекурсией с цитированием как на хабре – одна строка с консоли 🙂 + есть всякие штуки типа крутых роутов, скоупа, миграций, кеширования, деплоя. Надеюсь я тебя заразил спортивным интересом
верю :). я пробую другие языки/фреймворки для саморазвития.
symfony2 к этому идет.
FOSUserBundle дает “регистрацию, конфирмацию, авторизацию, восстановление пароля”, а MediaBundle “аплоад картинок”. потом ImagineBundle нарежет как нужно. комментарии тоже реализованы отдельным бандлом и подключаются довольно просто.
для деплоя я заюзал capifony (расширение capistrano). миграции берет на себя doctrine2.
php хороший язык. symfony2 и zf хорошие инструменты. нужно просто правильно их использовать.
Спасибо, чесно говоря не ожидал что симфони2 так проработан,
тогда я опишу моменты самого руби как языка
фича №1. пользователь аплоадит картинку 1600×1200 например надо сделать тумбы например 5 штук разной ширины
def make_all_thumbs(source)
// размеры
sizes = [‘1000′,’1100′,’1200′,’800′,’600’]
threads = []
sizes.each do |s|
// для каждого размера создаю тред и каждый проц режет по отдельности у меня например еще 2 ядра по 2 потока то четыре режется паралельно
threads << Thread.new(s) {
create_thumbnail(source+'.png', source+'-'+s+'.png', s)
}
end
end
Я сам не ожидал того что сервак отдал ответ и браузер нагенерил верстку в то время как тумбы еще продолжали резаться в тредах
фича №2 scope
моделька комментариев
class Comment 1970, :end_year => 2011)
аналогично для месяца
select_month(Date.today)
фича №5
HAML:
#profile
.left.column
#date= print_date
#address= current_user.address
.right.column
%p = current_user.email
%p = current_user.bio
SASS:
$blue: #3bbfce;
$margin: 16px;
.content-navigation {
border-color: $blue;
color:
darken($blue, 9%);
}
.border {
padding: $margin / 2;
margin: $margin / 2;
border-color: $blue;
}
haml делает чистенькие вьюхи – читать легче
sass помогает конфигурить css
фича №6
Область видимости @variable одинаково пишется и в контроллере и вьюхе и передавать не надо переменная сразу там, + во вьюхе можно запрос к БД сделать
список всех людей из БД сразу нагенериться в селект
блин парсер скушал пункты 2 3 4
согласен. удобно.
1я фича это конкретная реализация. треды это конечно хорошо. а вобще можно для этого использовать очереди или ресайзить при нужде средствами веб-сервера (модуль для nginx) или скриптами (напр. через ImagineBundle или хелпер в ZF) и не заморачиваться. это если картинок много
по 5й фиче. haml и sass есть в AsseticBundle
6ю фичу видел в Django. думаю можно так сделать и в Symfony2 заюзав get_defined_vars().
2,3 и 4 можно ещё раз? код лучше сразу на pastie.org ложить или в gist
фича №2 scope
есть моделька https://gist.github.com/1087544 я определяю ей scope теперь во вьюхе могу написать так https://gist.github.com/1087549 , также scope может быть определен для where условий(1-ного или нескольких) + если использовать лямбда функцию можно перевать параметры в него
фича №3 блягодаря тому что в руби всё объекты вот такие штуки есть
3.days.ago
2.weeks.ago
5.megabytes
или
[1..5].each do
фича №4 формы
Благодаря тому что формы используются во вьюхе и у них отсутвует даже сам класс формы, а валидация указана в моделе можно делать сложные формы очень легко, не знаю как на симфони но zf это просто жесть как надо было поизвращатся чтобы сделать сложную форму
+ есть вкусности типа http://apidock.com/rails/ActionView/Helpers/DateHelper/select_year
понятно.
значит, что касается 2й фичи, то можно сделать так как писал Кирилл Мокевнин в своей статье http://habrahabr.ru/blogs/zend_framework/98877/
3я фича это особенность языка, а не фреймворка. я согласен, что в руби есть свои плюсы 🙂
4я фича. в Symfony2 валидация указана в модели. сложные формы можно делать в вьюхах, а в модель потом ложить данные с запроса.
Спасибо, очень конструктивные ответы, можно сказать я мастер класс получил по symfony2 🙂
И вам спасибо 😉
Я тоже вынес пользу с нашей переписки.
Привет автору!
Я тут тоже начал изучать симфони2 но почему то я не понимаю.. Контроллер – понятно, шаблоны – нет проблем, а вот модель, что с моделью? Можно мне в двух словах какой принцип создания модели? Я хотел посмотреть принципы на примере, но еще больше запутался.. так как в бандлах, скачанных с симфони2бандл, очень много папок, тем более разных. Там я нашел и папку моделс но не въехал какой принцип ее создания, все наследуется с entity и с репозитория.. Но куда пихать остальной промежуточный функционал я не понял.. И еще, бандлы, нужно создавать один на проект? Или несколько, например, для работы с юзером ЮзерБандл, с постами ПостБандл?
Извините за глупые вопросы и спасибо за внимание 🙂 , жду ответа.
Советую хорошо проштудировать документацию. Тогда таких вопросов возникать не будет.
По моделям http://symfony.com/doc/current/book/doctrine.html. По бандлам http://symfony.com/doc/current/cookbook/bundles/best_practices.html
Потом можно погуглить и почитать блоги http://www.dobervich.com/2011/03/05/symfony2-blog-application-tutorial-part-ii-the-data-model/