<rmcreative>

RSS

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

  1. №6290
    Максим
    Максим 05.06.2012, 13:55:44

    Понятно, спасибо, но в принципе, я уже давно понял, что yii настолько гибкий, что переход с него на другой фреймворк превратится в сущий кошмар в виду отсутствия таковой гибкости....

  2. №6291
    Sam
    Sam 05.06.2012, 13:59:05

    Максим, ну почему? В Symfony 2, например, гибкости побольше, чем в Yii будет.

  3. №6292
    medar
    medar 05.06.2012, 14:13:05

    Из-за этой штуки привычные настройки контроллера смещены в роуты: фильтры, авторизация и др.

    Это можно делать в роутах (хотя мне тоже непонятно, зачем эту фичу форсит разработчик - неудобно же), но можно по-прежнему в контроллерах. У контроллеров есть метод before(), в итоге получается так же как в Кохане, например.

  4. №6293
    Максим
    Максим 05.06.2012, 15:43:19

    2Sam, по опыту как-то невзлюбил я французские творения.... Одно из них Le Sphinx называлось, как-то так..

  5. №6297
    Алексей
    Алексей 05.06.2012, 17:50:58

    Александр, спасибо за обзор. Пощупать все равно стоит на досуге :)

    Максим, а вы смотрели второй симфони? Мне первый ужасно не нравился, с yii как-то не мог подружиться никогда, а вот symfony 2 взлетел и летит очень быстро и качество на уровне (я имею ввиду качество получаемого продукта, в условиях незнания фреймворка, учитываю задачи которые возвращаются на доработку)

  6. №6300
    Максим
    Максим 06.06.2012, 0:55:44

    2Алексей, посмотрю обязательно, как будет время. Но, yii все равно будет моим любимым. Так как это мой первый php-фреймворк и очень многому он меня научил...

  7. №6302
    Big_Shark
    Big_Shark 06.06.2012, 5:16:16

    Вместо контроллеров возможно использовать анонимные функции. Модно, но бесполезно.

    Это не так уж и бесполезно, если привыкнуть к этому и не злоупотреблять этим.

    Допустим у нас сменился адрес страницы с одного на другой, и нам нужно сделать 301 редирект, мы в роуте пишем перенаправление на другой адрес, а не создает отдельный контролер с перенаправлением.

  8. №6305
    Антон
    Антон 06.06.2012, 10:46:52

    Вещь интересная, много статики.

    Только сложилось впечатление, что автор не очень хорошо знает php и его оптимизацию.

    Например, вместо

    $a === null

    автор применяет

    is_null($a)

    Первый вариант быстрее и он везде применяется в Yii. Конечно, это маленькая экономия времени, но почему бы не экономить на мелочь, особенно, если это не трудно?

  9. №6306
    Sam
    Sam 06.06.2012, 12:07:08

    Big_Shark, почему это не сделать в index.php до инициализации фреймворка или вообще не в конфиге вебсервера?

  10. №6309
    Arep
    Arep 06.06.2012, 17:27:34

    У нас на Yii вынесено приложение за вебрут. Это я к тому что сделать можно, а по умолчанию это или нет - не так важно, как мне кажется, хотя безусловно безопаснее когда вне вебрута.

    Жара... Бошка варит плохо)

  11. №6318
    Big_Shark
    Big_Shark 07.06.2012, 4:41:09

    Sam, Размытие логики приложения, а если у нас в базе хранятся дерево сайта и при перемещении ресурса создается линк который нам нужно отрабатывать в виде 301 редиректа.

    У нас может несколько разных контролеров выводить ресурсы из дерева сайта и все их заставлять просматривать не линк ли это? Будет дублирование кода, есть вариант вынести это в родительский контроллер конечно но мне нравится больше такой вариант Route::any('/', 'Node::301');

  12. №6323
    Max
    Max 08.06.2012, 6:29:08

    Request - это обертка для Symfony HttpFoundation Component? Не чисто...

  13. №6356
    Дмитрий
    Дмитрий 18.06.2012, 21:57:49

    Думаю что у таких многоуровневых иерархий классов навряд ли is_null($a) является слабым местом, хотя $a === null быстрее, отрицать не буду. Есть ощущение что вокруг БД слишком много "наворочено", но опять же доступ к БД все равно будет существенно медленнее чем исполнение PHP кода.

  14. №6363
    CeBe
    CeBe 21.06.2012, 0:16:03

    "console color coding" would love to have that in yii too :-)

  15. №7377
    Максим
    Максим 11.01.2013, 3:01:51

    Проблемы laravel высосаны из пальца. Очень многое взято из ROR, что несомненно большой плюс. Чего только стоят миграции в laravel. В yii они сделаны через жопу. Такое ощущение, чтобы лишь бы были. И во многом так... В споре Laravel vs Yii выиграет Laravel, но, к сожалению, не в РФ.

  16. №7381
    Sam
    Sam 13.01.2013, 3:11:05

    Что-то я не вижу фундаментальных отличий в миграциях. Примерно те же доступны действия, примерно такой же билдер схемы.

  17. №8031
    VOdessa
    VOdessa 30.05.2013, 0:45:00

    На днях вышел Laravel 4. Для проекта долго выбирал между фреймворками. Yii - интересный прогрессивный, но жутко забаженный фреймворк, с криво-написанными JS-скриптами, которые надо максимально допиливать, если хотите пользоваться прелестями "коробочных плюшек", впрочем, и допиливание не помогает. Для мелких сайтиков - вполне подойдет, для чего-то крупного, все-таки остановился на Laravel-е. Как показала практика, не подвело. Жалко месяца "убитого" на Yii.

  18. №8043
    Ant0ha
    Ant0ha 04.06.2013, 22:16:18

    VOdessa, жестко, особенно для блога разработчика yii. Я тоже думаю о переходе на Laravel 4, только со старой доброй коханы.

  19. №8044
    slider23
    slider23 04.06.2013, 22:20:12

    А у меня наоборот, разочарование от 4й версии. Повторилась ситуация со второй симфонией после первой, правда в лайт-варианте. Ларавель 4 по сути необходим только контрол-фрикам, помешанным на тестировании.

  20. №8869
    BrusSENS
    BrusSENS 13.03.2014, 12:58:31

    Зашёл на сайт, дизайн противный... Решил даже и не смотреть) Александр, надеюсь Yii2 не подкачает)))

  21. №8875
    Sam
    Sam 13.03.2014, 15:38:28

    BrusSENS, стараемся.

  22. №8876
    BrusSENS
    BrusSENS 15.03.2014, 0:57:47

    Sam, альфа в любом случае, уже ,поражает))) Спасибо за продукт)

  23. №9145
    Den
    Den 27.08.2014, 3:06:42

    Статические классы В Laravel их много. Очень много. Идея очень похожа на > хелперы из CodeIgniter и на CHtml из Yii. В общем-то, учитывая LSB, это не такая страшная проблема. Хороший момент, что функционал довольно чётко поделен между этими классами.

    Ответ - здесь: usman.it/laravel-4-uses-static-not-true/

    Контейнер — популярная нынче штука. Самое забавное, что понимают, что это такое, для чего нужно и как использовать очень немногие. Чаще всего у разработчика просто взрывает мозг и, либо он отказывается от этой штуки, либо слепо (и часто неправильно) его использует. По-моему, лучшим решением является тихое использование контейнера в ядре без заострения на нём особого внимания. Кому нужно — найдут.

    Ответ - здесь: leanpub.com/laravel

  24. №9555
    Евгений
    Евгений 12.01.2015, 11:00:52

    Мне наоборот показалось, что безсхемные модели это плюс, а не минус. Не дергается эта схема никчемная каждый раз, не надо ее пытаться кешировать, минус лишние запросы к базе. IDE все равно не подсвечивает эти атрибуты, поэтому так или иначе надо писать @property (я знаю про генераторы, но когда необходимо обновить таблицу все равно руками дописывать) Да и по сути, не все ли равно когда получить ошибку, на момент save() или на момент присваивания несуществующего атрибута, она все равно будет.

  25. №10071
    Александр Сорокин
    Александр Сорокин 27.11.2015, 2:19:54

    Ну ide почему не подсвечивает? PHP Storm очень даже подсвечивает, по крайней мере 9 и 10 версии. И не только подсвечивает, но и в автокомплит предлагает.

    Честно говоря не понимаю почему все так ломанулись на этот ларавел. Я захожу в GII, трачу 30 секунд и у меня готов вполне функциональный круд для управления табличкой. Конечно хотелось бы чтобы он был уже сразу с табличкой и контролами картика, но и так неплохо. А в ларавел, насколько я понял, мне придется всю эту требуху в лучшем случае копипастить от раза к разу.

  26. №10806
    Roman
    Roman 09.12.2016, 8:12:11

    Sam, заметь те что документацию всю переводят на Русский )) а не наоборот как в Yii. Lara !^-^!

  27. №10808
    Sam
    Sam 09.12.2016, 13:42:21

    Roman, в каком смысле?

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.