Laravel
5 июня 2012
Как разработчику Yii, мне полезно знать, что происходит вокруг. Пару недель назад посмотрел фреймворк Laravel. О нём уже пытались написать на хабре. Было это в мае, но из песочницы пост не выбрался. Со второй попытки вроде получилось. Сообщество активно комментирует.
По просьбам читателей, опишу, что я увидел в нём интересного и какие выводы были сделаны.
Сам фреймворк молодой, ему примерно год. Развивается очень бурно. Уже были выпущены три версии. Последняя получила волну хороших отзывов от приверженцев CodeIgniter. Настораживают слухи о его рекламе по телевидению, что для фреймворка, а тем более, для очень молодого фреймворка странно и необычно.
Итак, интересные для меня штуки:
Приложение по умолчанию вынесено за вебрут
Решение хорошее. Так безопасней. В Yii 1.1 приложение внутри вебрута потому как на старте Yii разворачивали его на всяких Dreamhost, на которых по-другому не запускалось. К Yii 2 планируется предоставлять несколько вариантов скелета приложения под разные размеры и окружения.
Решение для конфигурации под несколько окружений
При разработке относительно крупных проектов это приходится делать каждый раз (ну или использовать свою заготовку). Получить такую штуку из коробки приятно, хотя сделать самому тоже не сложно, тем более, многие предпочитают собирать проекты Phing-ом или Ant-ом.
IoC контейнер
Контейнер — популярная нынче штука. Самое забавное, что понимают, что это такое, для чего нужно и как использовать очень немногие. Чаще всего у разработчика просто взрывает мозг и, либо он отказывается от этой штуки, либо слепо (и часто неправильно) его использует. По-моему, лучшим решением является тихое использование контейнера в ядре без заострения на нём особого внимания. Кому нужно — найдут.
Документация
Документация написана хорошо. Язык простой, есть примеры, описаны частые затыки и пути их разрешения. На сайте, к тому же, приятное оформление, поэтому читается хорошо. Также вся документация поставляется в виде исходника вместе с фреймворком, но, к сожалению, оформлена настолько вырвиглазно, что приходится лезть на сайт.
Часто хвалят сами себя :)
Статические классы
В Laravel их много. Очень много. Идея очень похожа на хелперы из CodeIgniter и на CHtml
из Yii. В общем-то, учитывая LSB, это не такая страшная проблема. Хороший момент, что функционал довольно чётко поделен между этими классами.
Самое интересное в этой части, возможность расширять функционал этих классов:
HTML::macro('my_element', function() { return '<article type="awesome">'; }); echo HTML::my_element();
Плохо, что в некоторых местах идёт в этом направлении явный перегиб. Это касается классов, которые, скорее всего, будут расширяться разработчиком. macro
, возможно, позволит решить проблему, но разобраться в коде будет тяжело.
Bundles
Система пакетов — штука замечательная. Позволяет упорядочить множество расширений, которые пишут пользователи. Для Laravel, на данный момент, большинство расширений — обёртки популярных классов. То, что используются bundles — хорошо. То, что для них сделан велосипед — не очень, ведь в скором времени Composer вытеснит остальных из это ниши (я на это очень надеюсь).
Консоль
Реализация не лучше и не хуже остальных. Понравилось, что используется выделение цветом, как в Symfony 2.
События
Используются по полной. Глобальны, не привязаны к объектам. С одной стороны это позволяет писать довольно гибкий код, с другой — можно с этой гибкостью и не совладать, если пользоваться неправильно.
В Yii2 будет нечто среднее между декларативным способом Yii 1 и абсолютно свободным из Laravel.
ORM
Нижний слой работы с БД довольно обычный, похож на Yii. Также используется PDO, примерно такой же построитель запросов. Вот ORM у Laravel интересный. Из хорошего можно назвать:
- dirty attributes для моделей (это когда модель сохраняется только в случае, если изменились её атрибуты). Будет в Yii2.
- Очень интересный способ описания отношений. Понравился. Сами отношения классические. Такие, какими они были во времена становления Rails и Prado.
- Поддержка сохранения связанных объектов. За счёт использования dirty attributes, реализация довольно простая и эффективная. Yii2 будет уметь сохранять связанные записи, правда, чуть по-другому.
- В общем, API этой части хорош.
Из нехорошего:
- Не используются метаданные.
- Нет валидации в том виде, что есть в Yii.
- Модели безсхемные. Можно записать в модель
Post
, например, что-то вродеdateOfFirstPost
. До сохранения мы не узнаем, что такого атрибута у нас нет. Ошибку получим уже после попытки выполнения SQL в том виде, в котором её отдаёт СУБД. - Массовое присвоение включено по умолчанию. В условиях отсутствующей валидации в моделях и их безсхемности, штука для безопасности приложения фатальная. GitHub уже поплатился за такое-же решение в RoR. Самое забавное, что решение проблемы, которое попало в master — добавление возможности отключить массовое присвоение. В RoR так было с самого начала и это, как показала практика, не спасло программистов GitHub от ошибки.
- Жадная загрузка с условием. Штука мощная, но слишком сложная для реального использования. Код получается запутанным.
Роутинг
Вместо контроллеров возможно использовать анонимные функции. Модно, но бесполезно. Из-за этой штуки привычные настройки контроллера смещены в роуты: фильтры, авторизация и др.
Очень странное решение с вложенными контроллерами. Особого смысла так делать нет. Плюс имена контроллеров в этом случае строго определённые и похожи на Zend Framework 1, при том, что всё остальное именуется в другом стиле.
Пароли
Разработчик отказался поддерживать небезопасные md5 и sha1 в пользу bcrypt. Полностью поддерживаю.
View
Слой выполнен в виде кучи статических классов и хелперов. Хелперы таким образом делать, в общем, оправдано, а вот сам View — сомнительно. Скорее всего, именно эту часть будут расширять под свои нужны, прикручивая Twig или Smarty.
Assets
Похоже на Yii, но не настолько гибко. Для тех, кто пользовался Yii, ничего интересного.
Итоги
В итоге неплохо, но и не замечательно. Переход на Laravel с Yii 1.1 для боевых проектов сомнителен. Для тех, кому нравится CodeIgniter и не нравится Yii — хороший вариант.
Комментарии RSS по email OK
Понятно, спасибо, но в принципе, я уже давно понял, что yii настолько гибкий, что переход с него на другой фреймворк превратится в сущий кошмар в виду отсутствия таковой гибкости....
Максим, ну почему? В Symfony 2, например, гибкости побольше, чем в Yii будет.
Это можно делать в роутах (хотя мне тоже непонятно, зачем эту фичу форсит разработчик - неудобно же), но можно по-прежнему в контроллерах. У контроллеров есть метод before(), в итоге получается так же как в Кохане, например.
2Sam, по опыту как-то невзлюбил я французские творения.... Одно из них Le Sphinx называлось, как-то так..
Александр, спасибо за обзор. Пощупать все равно стоит на досуге :)
Максим, а вы смотрели второй симфони? Мне первый ужасно не нравился, с yii как-то не мог подружиться никогда, а вот symfony 2 взлетел и летит очень быстро и качество на уровне (я имею ввиду качество получаемого продукта, в условиях незнания фреймворка, учитываю задачи которые возвращаются на доработку)
2Алексей, посмотрю обязательно, как будет время. Но, yii все равно будет моим любимым. Так как это мой первый php-фреймворк и очень многому он меня научил...
Это не так уж и бесполезно, если привыкнуть к этому и не злоупотреблять этим.
Допустим у нас сменился адрес страницы с одного на другой, и нам нужно сделать 301 редирект, мы в роуте пишем перенаправление на другой адрес, а не создает отдельный контролер с перенаправлением.
Вещь интересная, много статики.
Только сложилось впечатление, что автор не очень хорошо знает php и его оптимизацию.
Например, вместо
автор применяет
Первый вариант быстрее и он везде применяется в Yii. Конечно, это маленькая экономия времени, но почему бы не экономить на мелочь, особенно, если это не трудно?
Big_Shark, почему это не сделать в
index.php
до инициализации фреймворка или вообще не в конфиге вебсервера?У нас на Yii вынесено приложение за вебрут. Это я к тому что сделать можно, а по умолчанию это или нет - не так важно, как мне кажется, хотя безусловно безопаснее когда вне вебрута.
Жара... Бошка варит плохо)
Sam, Размытие логики приложения, а если у нас в базе хранятся дерево сайта и при перемещении ресурса создается линк который нам нужно отрабатывать в виде 301 редиректа.
У нас может несколько разных контролеров выводить ресурсы из дерева сайта и все их заставлять просматривать не линк ли это? Будет дублирование кода, есть вариант вынести это в родительский контроллер конечно но мне нравится больше такой вариант Route::any('/', 'Node::301');
Request - это обертка для Symfony HttpFoundation Component? Не чисто...
Думаю что у таких многоуровневых иерархий классов навряд ли is_null($a) является слабым местом, хотя $a === null быстрее, отрицать не буду. Есть ощущение что вокруг БД слишком много "наворочено", но опять же доступ к БД все равно будет существенно медленнее чем исполнение PHP кода.
"console color coding" would love to have that in yii too :-)
Проблемы laravel высосаны из пальца. Очень многое взято из ROR, что несомненно большой плюс. Чего только стоят миграции в laravel. В yii они сделаны через жопу. Такое ощущение, чтобы лишь бы были. И во многом так... В споре Laravel vs Yii выиграет Laravel, но, к сожалению, не в РФ.
Что-то я не вижу фундаментальных отличий в миграциях. Примерно те же доступны действия, примерно такой же билдер схемы.
На днях вышел Laravel 4. Для проекта долго выбирал между фреймворками. Yii - интересный прогрессивный, но жутко забаженный фреймворк, с криво-написанными JS-скриптами, которые надо максимально допиливать, если хотите пользоваться прелестями "коробочных плюшек", впрочем, и допиливание не помогает. Для мелких сайтиков - вполне подойдет, для чего-то крупного, все-таки остановился на Laravel-е. Как показала практика, не подвело. Жалко месяца "убитого" на Yii.
VOdessa, жестко, особенно для блога разработчика yii. Я тоже думаю о переходе на Laravel 4, только со старой доброй коханы.
А у меня наоборот, разочарование от 4й версии. Повторилась ситуация со второй симфонией после первой, правда в лайт-варианте. Ларавель 4 по сути необходим только контрол-фрикам, помешанным на тестировании.
Зашёл на сайт, дизайн противный... Решил даже и не смотреть) Александр, надеюсь Yii2 не подкачает)))
BrusSENS, стараемся.
Sam, альфа в любом случае, уже ,поражает))) Спасибо за продукт)
Ответ - здесь: usman.it/laravel-4-uses-static-not-true/
Ответ - здесь: leanpub.com/laravel
Мне наоборот показалось, что безсхемные модели это плюс, а не минус. Не дергается эта схема никчемная каждый раз, не надо ее пытаться кешировать, минус лишние запросы к базе. IDE все равно не подсвечивает эти атрибуты, поэтому так или иначе надо писать @property (я знаю про генераторы, но когда необходимо обновить таблицу все равно руками дописывать) Да и по сути, не все ли равно когда получить ошибку, на момент save() или на момент присваивания несуществующего атрибута, она все равно будет.
Ну ide почему не подсвечивает? PHP Storm очень даже подсвечивает, по крайней мере 9 и 10 версии. И не только подсвечивает, но и в автокомплит предлагает.
Честно говоря не понимаю почему все так ломанулись на этот ларавел. Я захожу в GII, трачу 30 секунд и у меня готов вполне функциональный круд для управления табличкой. Конечно хотелось бы чтобы он был уже сразу с табличкой и контролами картика, но и так неплохо. А в ларавел, насколько я понял, мне придется всю эту требуху в лучшем случае копипастить от раза к разу.
Sam, заметь те что документацию всю переводят на Русский )) а не наоборот как в Yii. Lara !^-^!
Roman, в каком смысле?
— "Для тех, кому нравится CodeIgniter и не нравится Yii — хороший вариант".
В точку! Долгое время щупал и примеривался к двум фреймворкам после ci.
Выбрал в итоге Laravel, хотя Yii тоже хорош.
За 4 года многое изменилось и Laravel, по моему скромному мнению, немного вырвался вперед. Но это не отменяет того, что всегда должен быть хороший выбор, особенно у "незаслуженно унижаемых" php разработчиков.
Каждый разработчик выбирает то, что ему больше нравится и подходит. А также в зависимости от задач.
Пенять на Laravel или Yii, говорить что лучше — смысла нет. "На вкус и цвет" как говорится.
Удачи вам и всего хорошего, SamDark!
Читаю ваши посты и ценю ваши труды.