Введение


Я уже писал подобную статью, но она была очень не полной и не снабженной примерами, поэтому я решил взять вторую попытку и попытаться раскрыть данный вопрос наиболее полно!

В данной статье, не будут рассматриваться все тонкости разработки на фреймворках, поскольку это не возможно уложить в рамках одной статьи. Однако, можно достаточно подробно разъяснить те нюансы, которые помогут в выборе для изучения или реализации конкретного проекта. Сравнивать будет Yii2 и Laravel. Я понимаю, что это достаточно холиварная тема, результат которой обычно гласит, что каждый хорош по своему. Я, как человек работавший с обеими, попробую разъяснить свой подход к выбору фреймворка, и постараюсь наиболее объективно показать их минусы и плюсы.

Сразу предупрежу вопрос о том, почему не рассматриваем Symfony.
Дело в том, что Symfony более низкоуровневый фреймворк, который чаще берут для основы в крупных проектах, например таких, как написание собственного фреймворка для разработки. Его в принципе нельзя сравнивать с Laravel и Yii2, так как они используют его компоненты в своих реализациях. Symfony — это очень мощный продукт, позволяющий гибко настраивать практически любую систему под потребности, но в нем мало чего можно использовать в качестве готовых решений для мелких типовых задачек. На GitHub можно встретить множество библиотек или расширений написанных для того же Yii2 или Laravel как раз на Symfony.

Yii2


Начнем с Yii2, так как это мой первый фреймворк, который я изучил. Надо сказать, что изучается данный фреймворк очень легко, при минимальных знаниях ООП.

Плюсы


  • Легко изучается, низкий старт разработки
  • Имеет множество встроенных решений для интерфейсов
  • Отличный генератор моделей, контроллеров И CRUD

Минусы


  • Не очень гибкое формирование роутов
  • Плохо развивается (выход новых версий)
  • Слишком склеенные библиотеки для frontend'а с backend'ом

Теперь расскажу о каждом более подробно. Последний из минусов вообще мне кажется не понятным на первый взгляд, но я не знаю как сказать по другому, чуть ниже подробно объясню, что я имел ввиду.

Легко изучается. Фреймворк действительно легко изучается, и посидев день два, над небольшим проектом, вы уже начинаете спокойно кодить на нем. Для начала изучения маловато хорошей литературы на русском языке, но это хорошо компенсируется благодаря хорошему справочнику на английском. В крайнем случае Google-переводчик. Сейчас обрадую, так было раньше. Совсем недавно, они обновили свой сайт с гайдами и документацией, и теперь есть гайды на русском языке, находятся они здесь. Информация по API пока не переведена, но там ничего сложного. Даже с небольшими знаниями технического английского, все довольно просто, поскольку там просто описываются методы, что они принимают, отдают и что вообще делают, информация тут.

Встроенные решения для интерфейсов можно описывать целой небольшой книжкой, но я постараюсь кратко. В систему встроен Bootstrap, к сожалению пока третий, и кучка собственных модулей, которые с ним связаны.

Можно даже плохо владеть версткой на bootstrap, и при этом с помощью встроенных в Yii2 методов сделать всплывающие модальные диалоги, окошки, выпадающие списки, спойлеры и т.д.

Вот небольшой пример, который можно встретить на целой куче сайтов, и даже в официальной документации Yii2:

Пример модального окна
use yii\bootstrap\Modal;

Modal::begin([
 'header' => '<h2>Hello world</h2>',
 'toggleButton' => ['label' => 'click me'],
 'footer' => 'Низ окна',
]);

echo 'Say hello...';

Modal::end();


Данный пример как раз создает модальное окно, с заголовком <h2>Hello world</h2>, кнопкой click me, которая открывает этот дилог, с телом «Say hello...» и футером «Низ окна».
Не нужно писать всякие там 'data-target="#id-modal"' или подобное, система расставит все это сама. Такие вещи в Yii2 — называются виджетами, которые может делать вообще любой программист, и тащить любой фронтенд на свою backend — сторону. Но это на самом деле и минус, самый последний о котором я говорил выше. Почему это минус разберем чуть позже, пока об удобстве этого всего.

Любой подобный виджет может вызываться как обычный класс со статическим методом, принимать параметры, от которых будет что-то зависеть в виджете и закрываться. Есть еще способы реализации виджетов, которые не требуется открывать и закрывать, они сами это сделают, им нужно только передать параметры, от которых будет что-то зависеть, приведу пример из сторонней библиотеки

Пример стороннего виджета
// Multiple select without model
echo Select2::widget([
    'name' => 'state_2',
    'value' => '',
    'data' => $data,
    'options' => ['multiple' => true, 'placeholder' => 'Select states ...']
]);


Это пример из библиотеки, позволяющей вызывать в представлениях виджет Select2, от kartik-v, ссылка на GitHub.
Вот такой виджет подключает все скрипты, размечает input и select и обрабатывает их библиотекой Select2.

В общем, с помощью таких вот решений, которые уже кто-то написал, или вы напишите сами, можно складывать представления сразу с интерфейсом и это позволяет разрабатывать очень быстро.

Генератор моделей, котроллеров и представлений — это отдельная вещь, но связана с предыдущей частично. В Yii2, есть некая GUI область, для выбора различных генераций. Обратите внимание, у других фреймов, если и есть генераторы, то, как правило, только консольные. Здесь есть и интерфейс и очень удобно пользоваться, называется эта прелесть gii.

Вот как она выглядит:
image

На картике видно что она может. Генератор моделей и CRUD самые частопригождающиеся вещи в ней. Модели генерируются не как в laravel, в интерфейсе указывается таблица, название и расположение класса для модели, с учетом пространства имен, программа сама подтягивает все зависимости (можно отключить, если не нужны), если расставлены foreign key, и «выкатывает» модель, со всеми свойствами взятыми по колонкам таблицы и методами для связки с другими, если они есть.

Признаюсь честно, такого генератора, я больше не видел нигде.

CRUD генерирует готовые интерфейсы, контроллеры к ним, для управлениями данных в указанной ему модели. Т.е. Сначала нужно создать модель, а потом делать CRUD генерацию. На выходе, вы получите сразу готовый интерфейс с определенным адресом, в котором можно заводить новые записи таблицы, редактировать и удалять их.

Очень удобно использовать для создания панелей администраторов или каких-нибудь дашбордов. Быстро генерируется готовый интерфейс, который потом можно отредактировать, и пользоваться, назначив защиту роутам путем авторизации или иначе. Сам интерфейс использует множество встроенных виджетов для этого, которые тоже можно перенастраивать по своему усмотрению. Это действительно быстрая разработка систем с интерфейсами управления данных. Можно достаточно быстро сделать дельную CMS для нужд конкретного проекта. Мое мнение, что это, самый главный плюс Yii2 в сравнении с другими фреймворками.

Теперь поговорим о минусах. О них достаточно коротко, чтобы не раздувать статью до небывалых размеров.

Не очень гибкое формирование роутов. В контроллерах классов для Yii роуты указываются следующим образом:

Пример создания маршрута в контроллере
/*----*/

   /**
     * Your Annotation
     * @return mixed
     */
    public function actionIndex()
    {

        return $this->render('index', []);
    }
    
/*----*/


Любой путь в контроллере должен начинаться со слова action и с заглавной буквы указывается его адрес, например Index. Если написать из двух слов, например actionArticlesList, то путь получится следующий: /название_контроллера/articles-list. Если нам нужно как то по своему организовать формирование роутов, есть два способа:

  • Задать правила в конфиге
  • Написать свой класс для конкретной группы роутов, и указать его в конфиге.

Подробно останавливаться на конфиге не буду, но выглядит это примерно так:

[
/*---*/
'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                '<module:\w+>/<controller:\w+>/<action:(\w|-)+>' => '<module>/<controller>/<action>',
                '<module:\w+>/<controller:\w+>/<action:(\w|-)+>/<id:\d+>' => '<module>/<controller>/<action>',
            ],
        ],
/*---*/
]

В rules, как раз указываются правила. Там и можно указать свой класс, или придумать свое выражение для роута, об этом можно почитать более подробно в официальной документации.

Второй пункт минусов, думаю пояснять особо не стоит. Следует обратить внимание, что Yii2 до сих пор использует bootstrap-3, и нового за последнее время в нем прибавилось достаточно мало.

Ну и последний пункт, который я обещал пояснить — это слишком большую склеенность фронтенда с бекендом. Как и писал выше, множество виджетов и других решений, сразу делают генерацию готовых решений в представлениях (views). Это хорошо и быстро, но многие из них, выбрасывают скрипты прямо в тело страницы, в коде этих виджетов перемешан php и html, что не очень хорошо выглядит и достаточно проблематично поддерживать такой код.
Такой метод разработки не позволяет пользоваться сборщиками типа WebPack, Gulp или другими. Точнее пользоваться можно, но придется отказаться от основного преимущества Yii2 — не пользоваться генераторами и готовыми решениями для интерфейса. Не использовать классы, которые позволяют собирать скрипты и css в assets и тому подобные сложности. А если отказаться от них, что тогда останется? Риторический вопрос!
В современной разработке все идет к тому, чтобы как можно дальше отделить frontend от backend, и в этом плане Yii2 устаревает. Надеюсь этот минус достаточно понятен.

Laravel


Поскольку мы достаточно подробно познакомились с Yii2, здесь можно привести плюсы и минусы для сравнения с предыдущим фреймворком Yii2

Плюсы


  • Имеет встроенный сборщик скриптов и scss
  • Встроенный шаблонизатор Blade
  • Очень гибкое формирование Роутов
  • Очень гибкие возможности для написания REST API
  • Быстро развивается

Минусы


  • Большой функционал работает через фасады и IDE-системы не видят методов и свойств в некоторых классах, показывая предупреждения
  • Изучается немного сложнее Yii2
  • Нет официальной документации на русском языке
  • Нет встроенных генераторов интерфейсов

Встроенный сборщик основан на WebPack, по сути это надстройка над ним, которая позволяет легко начать работу, и собирать frontend не копаясь в тучных мануалах по WebPack и его настройке.

В системе он зовется laravel mix, и это по сути WebPack, уже настроенный под большинсво задач, где мы просто указываем откуда берем исходники, и куда ложим результат.

Пример mix'a
let mix = require('laravel-mix');

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');


В примере стандартная конфигурация, которая у вас появляется сразу после инсталляции фреймворка. Таких миксов там можно создавать сколько угодно много, если у вас есть разделение нескольких frontend приложений.

В примере стандартная конфигурация, которая у вас появляется сразу после инсталляции фреймворка. Таких миксов там можно создавать сколько угодно много, если у вас есть разделение нескольких frontend приложений.

Микс сразу умеет собирать scss, однофайловые компоненты Vue, а так же в новых версиях Laravel, Vue.js идет сразу в поставке фреймворка.

Шаблонизатор Blade, чем то сильно напоминает Twig, но синтаксис и принцип работы немного другой. Какой из них лучше не знаю, но я пока не столкнулся с такими задачами, которые можно реализовать на Twig и нельзя реализовать на Blade. Едиснтвенный минус Blade, который я пока вижу, это то, что Twig известен многим, а Blade только разработчикам Laravel.

Очень гибкое формирование роутов. Механизм очень похож на symfony, только вместо аннотаций, используется отдельный файл и фасадный класс Route, с набором статических методов.

Плюс по сравнению с Yii2 в том, что в контроллерах методы могут называться как угодно, и сами роуты тоже. Мы пишем их в отдельной дирректории, и указываем текущий роут, какого он типа-запроса (POST, GET и т.д.), и указываем на какой он идет контроллер и метод в контроллере. Так же можно задать имя, для вывода по нему ссылки через шаблонизатор Blade.

Пример назначения роутов
/*---*/
Route::get('/dashboard/newsList', 'DashboardController@newsList')->name('dashboard/newsList'); //Запрос GET, его адрес, вторым параметром указывает на контроллер и метод

Route::middleware('auth')->delete('/dashboard/newsList/news/{uuid}', 'APINewsController@DeleteNews'); //Запрос DELETE, требующий авторизации, передающий последним параметром в URL uuid, И направленный на соответствующий контроллер и метод.
/*---*/


В роутинге удобно использовать middleware, которые перед тем как отправить запрос на обработку контроллера могу проверить какие-то данные и в зависимости от них отправить контроллеру на обработку или нет. Одним из таких проверок может быть авторизация пользователя в системе. Причем сами middleware можно использовать как в контроллере, так и при объявлении маршрута в routes.

Система получается очень гибкая. Можно на один маршрут, в зависимости от метода передачи HTTP-запроса назначить разные обработчики одного контроллера.

Я не указал об этом в Yii2, но там тоже есть система управления такими запросами, но как и все другие роуты, настраивается или через собственный класс или через конфиг, что не всегда удобно. В Yii2 есть yii\rest\ActiveController — который позволяет быстро настройить REST FULL API, но он тоже не так гибок, как хотелось бы.

Благодаря такой системе роутов, я бы выбрал именно Laravel для построения проекта работающего на REST API. Таким образом, в данном пункте я ответил и на следующий плюс «Очень гибкие возможности для написания REST API»

Laravel очень быстро развивается. Постоянно выходят новые версии, которые исправляют ошибки и недоработки предыдущих, быстро повышая эффективность фреймворка. Он наверное самый быстроразвивающийся фреймворк из тех, что я знаю.

Переходим к минусам.

Работа через фасады, большинства обширных классов Laravel. Такое сложное предложение, я поясню! Дело в том, что во многих классах фреймворка используется динамическое создание свойств и методов, в зависимости от каких-то условий.

Проще привести пример. Мы объявляем класс модели работы с базой данных, которая является расширением стандартного класса Illuminate\Database\Eloquent\Model, в котором нет статических методов where, select и т.п., но на самом деле они есть и ими можно пользоваться. Вот такие чудеса. Дело в том, что такие методы образуются из так называемых фасадов, которые считывают обычные методы класса и превращают их в статические. А свойства получаются путем обращения к базе данных. Конечно удобно, что можно с одними и теми же свойствами работать и статически и динамически, но таким образом, получается что IDE не видит данные методы и показывает предупреждение о вызове несуществующих методов. Правда для этой проблемы уже есть решение — использовать IDE-helper, который решает проблему. Даю ссылку на GitHub. На GitHub довольно подробно расписано как с ним работать и устанавливать.

Пункт «Изучается немного сложее Yii2» нельзя считать объективным, так как это лично мое мнение. Мне было достаточно сложно перестроиться после Symfony и Yii2 на эту магию с фасадами. Однако, если хорошо подумать, я посидев пару дней над гайдами и мануалами, тоже начал потихоньку писать на нем, совершенствуя свои знания и навыки.

Мне кажется, что если бы я начал изучать сначала Laravel а потом Yii2, я бы сказал, что Yii2 было сложнее изучать, так что тут дело каждого и субъективно. В любом случае, изучать их довольно просто оба.

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

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

Генераторы в Laravel вообще далеки от Yii2, но кое-что они всё-же могут. Есть генераторы консольных команд, которые дают готовый каркас для работы с консолью, генераторы моделей, контроллеров и другие. Но в отличии от генераторов Yii2 — они пустые. Т.е. Если мы генерируем модель, она будет пустая. Нужно самим указывать какое поле будет являться первичным ключом, к какой таблице она относится, какие имеет связки и т.д. Некоторые говорят, что это добавляет гибкости, но ведь в Yii2 вы тоже можете удалить стандартную генерацию и написать свою. Не думаю, что это тема для споров. Тут Yii2 определенно победитель.

Заключение


Итак, мы подобрались к главному вопросу этой статьи «Какой фреймворк выбрать?». Как видно из данного массивного описания основных отличий — оба фреймворка хороши и действительно хороши по своему.

Yii2 мы можем использовать в тех случаях, когда нет особо больших требований к админке фронтенда, а проект нужно сделать красиво и в сжатые сроки.

Laravel — когда у нас есть особые требования к фронтенду и чуть побольше времени на разработку интерфейсов. А так же при необходимости полного разделения frontend'a от backend'a.

Какой фремворк изучить первым, выбирать вам, по этому поводу я написал свое мнение. Надеюсь столь подробная информация позволит вам сделать правильный выбор! Желаю всем удачи в разработке и интересных проектов!

Ссылки


Официальный сайт Symfony
Официальный сайт Yii2
Официальный сайт Laravel

Ссылки из статьи:

Yii Select2 от kartik-v.
Официальный сайт Select2.
Гайды на русском языке для Yii2 (официальная документация)
API Yii2 (официальная документация)

То что обещал дать в тексте статьи:

IDE-helper для Laravel (GitHub)
Русскоязычная документация Laravel с примерами (не официальная, но хорошая)

Комментарии (98)


  1. hudson
    13.04.2018 15:11
    +1

    Ни в коем случае не ведитесь на «простоту» Yii! В качестве первого фреймворка ни в коем случае не рекомендую — плохому научитесь. Сделайте по простенькому проекту на Laravel / Symfony / ZF и выберите тот что понравится. Не нойте что сложно (не сложно!) — это окупится с лихвой в будущем.


    1. OKyJIucT
      13.04.2018 15:55

      Ваше заявление звучит примерно так: «Если вы хотите использовать простой инструмент, используйте вместо него сложный».

      Вы советуете начинать изучение фреймворков с тех, что сложнее, и велика вероятность, что человек не осилит, и пойдет дальше говнокодить на коленке. Как по мне, то лучше сначала начать с простого, постепенно усложняя, чем сразу нырять в омут с головой.


      1. hudson
        13.04.2018 16:25

        Я вкладывал немного другой смысл — «не гонитесь за ложной простотой». Луше вложить немного усилий в самообразование и получить хороший старт для дальнейшего роста.

        И да, я более чем уверен что меня мало кто послушает. Проще «говнокодить на коленке» на Yii, чем задумываться над тем, почему же в шаблоне нельзя делать «SomeModel->listAll()» и многие другие славные вещи…

        Yii не отвратителен, но изначально (в том числе в документации) он дает массу вредных советов и не запрещает разработчикам стрелять себе в ногу, там где им хочется.


        1. OKyJIucT
          13.04.2018 16:27

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

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


          1. hudson
            13.04.2018 16:29

            В точку, менторство у нас не в чести, увы. Сколько хороших советов мне не дали в свое время… )))


        1. dastanaron_dev Автор
          13.04.2018 16:28

          Ха, про выстрел в ногу точняк. Это даже с виджетами для фронта можно соеденить. Соберешь фронт себе на бек и будешь сам его потом палкой ковырять, а когда проект разрастется и потребуется разделить обязанности, будут большие сложности, вот это и есть выстрел себе в ногу, поэтому я и назвал это и минусом и плюсом


          1. hudson
            13.04.2018 16:33

            Может я слишком категорично высказался, но в последнее время много проектов на Yii пришлось просмотреть — везде схожие ошибки. Наболело. И просматривая список вакансий постоянно вижу именно Yii. Да, просто, да быстро. Но чтобы тянуть на нем более-менее серьезный проект, на старте нужен серьезный опыт.


            1. SerafimArts
              13.04.2018 16:47
              +1

              Тоже самое и в случае Laravel происходит. Слишком много он позволяет. А новички хотят скорее начать, не понимая к чему это приведёт в будущем.

              Да вот те же самые фасады. Мало кто понимает, что их стоит использовать лишь в качестве хелперов, например в консольке или миграциях, а для бизнес-логики только DI. А потом открываешь какой-нибудь проект и видишь методы контроллеров по 500 строк каждый, которые при этом ещё и копипастятся. Хотя бы сервисный слой для этого? Какой сервисный слой? Не… не слышал =)

              Кажется, что это «бич» любого решения с низким порогом входа, но склонен согласиться с тем, что в случае Yii — там на порядок сложнее вывести такой проект в адекватное состояние. Хотя тут я не слишком объективен.


              1. SamDark
                13.04.2018 17:18

                То же самое происходит вне зависимости от фреймворка. Если у вас первым был Yii и вы прошли там по всем граблям, вы не будете на них наступать в том же Laravel и наоборот.


  1. GraneDirval
    13.04.2018 15:36

    Yii слишком много позволяет в плане архитектуры, поэтому на нём слишком часто встречается всякой негодности. Вот что мне в нём действительно нравится, так это их queryBuilder. Доктриновский после yii'шного кажется слишком убогим.


    1. dastanaron_dev Автор
      13.04.2018 15:39

      Я бы сказал наоборот, в плане архитектуры — не очень много позволяет. Если это про расположения файлов в проекте. Тут с Ларой они одинаковы. Симфони самый развязанный в плане архитектуры. А по поводу QueryBuilder'a скажу, что чистый доктриновский да, немного сложноватый, за счет непривычности описания в аннотациях, но в Ларе например он переорганизован и ничем не хуже Yii-шного, даже немного похож, поэтому их я даже не сравнивал


      1. SerafimArts
        13.04.2018 16:29

        Симфони самый развязанный в плане архитектуры

        Ну… Вот тут я бы поспорил. Слишком много ограничений у симфони. Простой пример: Зарегистрировать UserInterface из секьюрити в контейнере, чтобы потом он мог резолвиться через автовайринг или парам резолвинг. Можно сделать, но это оверинжинеринг и проще сделать фектори (или дёргать токен сторадж).

        В этом плане у ларки непосредственно архитектурных ограничений ещё меньше и возможностей больше. У Symfony другое преимущество — он более развязный с зависимостями. Т.е. сами компоненты на порядок гибче, но их и так же на порядок меньше.


        1. BoShurik
          13.04.2018 17:32

          Зарегистрировать UserInterface из секьюрити в контейнере, чтобы потом он мог резолвиться через автовайринг или парам резолвинг. Можно сделать, но это оверинжинеринг

          А в чем именно оверинженеринг? Простенькая фэктори + строчка в конфиге


          Symfony\Component\Security\Core\User\UserInterface:
              factory: ['@App\UserProvider', 'get']


          1. SerafimArts
            13.04.2018 17:44

            Если честно — у меня вообще вылетел из головы этот способ. Ваша правда.

            Ладно, другой пример. Надо для роутов добавить метаинформацию произвольного формата, при этом она должна мерджиться при наследовании (т.е. инклудах). Ну вот простой пример:

            api.example:
                resource: "@AppBundle/Resources/config/routing.yml"
                prefix: /api
                defaults:
                    _middleware:
                        - AppBundle\Middleware\QueryLogs
                        - AppBundle\Middleware\JsonResponsePrettifier
                        - AppBundle\Middleware\ExceptionsLogger
                        - AppBundle\Middleware\CrossOrigin
                        - AppBundle\Middleware\ThrowableToExceptionsTransformer
            


            Проблемы:
            1) Можно указывать только строки или массивы (т.е. нельзя скинуть ссыль на сервис)
            2) Внутри подключаемого ресурса эти параметры не мержатся.

            Только не надо говорить, что это не Symfony-way и надо на эвенты всё вешать, а конфиги выносить в другое место. Ну вот взбрело такое в голову, присобачить миддлвари. Мы же об архитектурной гибкости говорим.


  1. SerafimArts
    13.04.2018 16:10

    Большой функционал работает через фасады и IDE-системы не видят методов и свойств в некоторых классах, показывая предупреждения

    Все «фасады» лежат в конфигах, в файле app.php. Первым делом при старте нового проекта — берёте и удаляете вообще всё, что там лежит. И никаких фасадов.

    «Фасад» в терминах Laravel — это статический прокси + локатор на сервис внутри DI. Подчёркиваю, внутри DI. Каждый сервис может инжектиться (в том числе через автовайринг) по интерфейсу, такие интерфейсы в рамках Laravel называются «контрактами», так же как бины (bean) в Spring.

    Механизм очень похож на symfony, только вместо аннотаций, используется отдельный файл и фасадный класс Route, с набором статических методов.


    В классе роутов нет ни одного статического метода. Например: github.com/illuminate/routing/blob/master/Router.php#L139

    Нет документации на русском языке.

    Есть же: github.com/LaravelRUS/docs Не вся (т.е. не совсем актуальная), но этого достаточно более чем, т.к. 95% кода и описания возможностей не сильно меняется между минорными версиями.

    UPD: Не увидел ссылки в футере. Всё ок =)

    Увы, не могу оценить часть про Yii2, т.к. в основном использую другие фреймворки (в частности Symfony), но судя по части про Laravel — его вы знаете крайне поверхностно, что делает эту статью довольно субъективной, без попыток реального сравнения возможностей.

    С другой стороны — могу подтвердить, что в Yii2 действительно генераторы кода мощнее, но ничего не мешает в Laravel так же указать ссылки на шаблоны для генерации кода.


    1. dastanaron_dev Автор
      13.04.2018 16:17

      Спасибо за комментарий. Я не видел смысла вдаваться в дебри смысла работы фасадов, скорее это предупреждение, что придется с этим столкнуться, поскольку ни в Yii2 ни в Symfony этого нет. Но то, что вы описали в комментарии — очень хорошо. Спасибо за дополнение!


      1. SerafimArts
        13.04.2018 16:38
        +2

        поскольку ни в Yii2 ни в Symfony этого нет.


        Сам механизм, который делает всё тоже самое и содержит точно такие же проблемы есть и в Yii и в Symfony.

        Сервис локация (фасады и проч)
        Laravel:
        \DB::xxx();
        


        Yii:
        Yii::$app->db->xxx();
        


        Symfony:
        $container->get('doctrine')->xxx();
        


        1. dastanaron_dev Автор
          13.04.2018 17:01

          Сложно сказать. Может я не знаю, но способ получить подключение к базе можно так же через сервис локацию

          $connection=Yii::app()->db;
          

          Но это как раз через фасады, которые в конфиге задаются. Либо расширением класса ActiveRecord, чем и являются модели. Тут просто не доктрина, поэтому сложно провести аналогию, принцип немного другой.

          А в той же ларе или симфони, можно получить низкоуровневый объект PDO

          Я не совсем об этом речь вел. Модели я чисто для примера взял. В Ларе например и в роутах используются методы Route::post(/***/), которые по факту не являются статичными. Я в общем о том, что такие явления есть


          1. VolCh
            13.04.2018 17:10

            Как-то так:


            Yii::$container->get('db');

            vs


            public function __construct(\yii\db\Connection $db)


          1. SerafimArts
            13.04.2018 17:18

            Сложно сказать. Может я не знаю, но способ получить подключение к базе можно так же через сервис локацию

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


            Ну вот есть какой-то класс, например database query logger, зарегистрируем его в контейнер (можно же?) по имени "dbQueryLogger". Как сказать проекту, что получая Yii::app()->dbQueryLogger (или как-то так, поправьте если ошибаюсь) нужно создавать этот объект и прокидывать туда соединение с базой + PSR LoggerInterface.


            UPD: О, VolCh ответил на вопрос. Спасибо. А в методы прокидывать так же можно?


            1. VolCh
              13.04.2018 17:32

              Что-то типа


              $controller = new class
              {
                public function indexAction(\yii\db\Connection $db) 
                {
                }
              }
              Yii::$container->invoke([$controller, 'indexAction']);

              ? Не уверен, что сработает с анонимным классом, хотя не вижу причин почему нет :)


              1. SerafimArts
                13.04.2018 21:42

                Прикольно. Почитал доку — убедился что это так (кажется, надо было чуть раньше, а не мучать вопросами на хабре? =) ). Даже ребинд параметров завезли для этого invoke (второй аргумент). Ещё чуть-чуть и почти до Laravel дотянет.


        1. hudson
          13.04.2018 17:18

          Да, зря контроллер в Symfony сделали ContainerAware… )


        1. SamDark
          13.04.2018 17:21

          По Yii 2 пример ровно такой же :) Инъекция через рефлексию в конструктор поддерживается.


  1. mxuser
    13.04.2018 16:25

    Также хочу дополнить, что Yii2 на самом деле не очень-то привязан к Bootstrap 3. Можно не использовать пакет 'yiisoft/yii2-bootstrap', а вместо него подключить, например, 'digitv/yii2bootstrap4', — и имеем набор классов-виджетов Bootstrap 4


    1. dastanaron_dev Автор
      13.04.2018 16:26

      Безспорно. Можно и свои расширения с виджетами написать и тем же функционалом и юзать например bulma вместо бутстрапа. Но речь то о том, что у него встроенно из коробки, а не установлено из вне.


      1. mxuser
        13.04.2018 16:31

        В данном случае — просто в приложении-шаблоне (https://github.com/yiisoft/yii2-app-basic) в файле composer.json указана зависимость 'yiisoft/yii2-bootstrap'. Если не разворачивать приложение из шаблона, а организовывать структуру проекта самому (ну, или же просто убрать эту зависимость), — пакет не будет доступен. Он не прибит гвоздями, насколько я знаю.


        1. dastanaron_dev Автор
          13.04.2018 18:31

          Да это понятно. Так в любом решении, можно любой пакет заменить на другой или собрать по частям. Речь о работе из коробки, без лишних заморочек и для типовых задач. Когда человек выбирает фреймворк, на котором он будет учиться писать, он не собирается делать Highload проекты и пересобирать фреймворк. До этого еще дойти надо!


          1. mxuser
            13.04.2018 18:50

            Кажется, я неточно выразился.
            Я имел в виду то, что Bootstrap3 можно заменить заменой строчки в composer.json. Мне кажется, это — не пересборка фреймворка


  1. webdevium
    13.04.2018 16:29

    В Yii2 есть yii\rest\ActiveController — который позволяет быстро настроить REST FULL API...

    Вот как раз REST FULL API он и позволяет делать.
    А вот RESTful все таки удобней разрабатывать используя функциональные возможности Laravel


    1. dastanaron_dev Автор
      13.04.2018 17:05

      Я это и имел ввиду, в чем смысл комментария?


      1. webdevium
        13.04.2018 18:11

        У Вашего текста всего лишь терминология изменена.


  1. VolCh
    13.04.2018 16:38

    В Symfony (3) из коробки 4, если не ошибаюсь, 4 способа задавать роуты, да и вообще конфиги: php, yaml, xml, annotation. И не понимаю, почему Symfony низкоуровневый фреймворк — уровень у него обычный для современных фреймворков. И не фреймворк laravel построен на базе фреймворка symfony, а фреймворки laravel и symfony построены на базе компонентов symfony, первый в меньшей степени, второй в большей.


    1. dastanaron_dev Автор
      13.04.2018 17:07

      image
      С первой страницы официального сайта симфони. Означает, что используются не компоненты, а именно фремворк. А Вот Yii использует именно компоненты.

      А низкоуровневый — это как аналогия языков программирования. Типа PHP, JAVA, PYTHON языки высокого уровня, а C, C++ или Асемблер низкоуровневые языки. Тут дело в доступности данных низкого уровня (дампы или ячейки памяти, отдельные биты в кластерах), а не в том, как роуты задаются


      1. SerafimArts
        13.04.2018 17:22

        Symfony — это набор компонентов, который называется "фреймворком". Так же как, например, Illuminate — тоже "фреймворк".


        Сборка приложения в симфони называется symfony flex или symfony standard. У Illuminate же называется Laravel. Что тоже называют фреймворками, хотя это только сборка.


        1. VolCh
          13.04.2018 17:56

          https://github.com/symfony/framework-bundle — вот фреймворк симфони
          https://github.com/laravel/framework — вот фреймворк ларавел


          1. KoloBango
            13.04.2018 18:58

            github.com/symfony/symfony — вот фреймворк симфони.
            А github.com/symfony/framework-bundle — это FrameworkBundle использующийся в составе фремворка

            Symfony более низкоуровневый фреймворк

            Имхо автор не имеет реального опыта работы с симфони и краем глаза увидел что компоненты симфони используются в Laravel и т.д… Symfony фреймворк в том же смысле что и Laravel позволяющий реализовывать хотя бы тот же MVC паттерн


      1. VolCh
        13.04.2018 17:58

        Так чем у симфони уровень ниже чем у ларавеля? какие, например, абстракции не предоставляет симфони?


        1. dastanaron_dev Автор
          13.04.2018 18:27

          Ай, ну как же не понять то. Низкоуровневый — не значит хуже или что то невозможно реализовать или чего-то не предоставляет. Низкоуровневый язык программирования означает, что ты можешь работать с данными не на уровне объектов и чисел и строк, а на уровне дампов памяти, битов, положения битов в кластере и тому подобные вещи. В аналогии с фреймворками я имел ввиду, что для Симфони ты будешь больше писать ручками, для осуществления каких-то типовых задач, которые в свою очередь в Ларе и Юии имеют готовые решения.


          1. php7
            13.04.2018 22:32

            Хлебные крошки?


          1. VolCh
            14.04.2018 10:03

            Так каких "каких-то"? У каких типовых задач по разработке на PHP нет готовых решение в symfony и есть в yii/laravel?


            В Symfony есть абстракции над http и сессиями, роутинг, шаблонизация, кеширование, работа с формами, валидация, работа с ФС, контроль доступа, DI, i18n, l10n и переводы, конфигурация, сериализация, работа с процессами ОС, свой http-клиент и работа с DOM, бридж к ORM, бридж к свифтмейлеру, бридж к пхпюнит, бридж к монолог, бридж к твиг, средства отладки и профилирования. Что ещё нужно от фреймворка?


            Генераторы не в счёт, они не являются частью фреймворка как каркаса приложения, они часть экосистемы вокруг каркаса.


  1. Akdmeh
    13.04.2018 17:31

    Ну и замечание: многие вещи в плане разделения frontend/backend будут сделаны в Yii 2.1. Как минимум — отказ от привязки к jQuery. Разработчики прекрасно знают о подобной исторической проблеме архитектуры и пытаются ее постепенно решить по мере возможностей.
    Но в плане разработки сайта на коленке с простой админкой — это очень сильная сторона Yii. По сути можно сделать на нем простой блог за 30 минут и это не преувеличение.


    1. dastanaron_dev Автор
      13.04.2018 18:22

      С этим полностью согласен!


  1. cawakharkov
    13.04.2018 18:32

    Интересно, с каких это пор в симфони стали отсутствовать инструменты для решения небольших типовых задач?
    А если выбирать из 2х зол, я бы выбрал меньшую — Laravel.


    1. dastanaron_dev Автор
      13.04.2018 18:41

      Приведу пример. В Симфони есть генератор готовых интерфейсов? Встроенный удобный сборщик фронтенда как у Ларавел? Помельче: хелперы для работы с конфигами, или какими-то данными. А интерфейсы для данных — это вполне типовая задача.


      1. BoShurik
        13.04.2018 18:43

        В Симфони есть генератор готовых интерфейсов?

        https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html


        Встроенный удобный сборщик фронтенда как у Ларавел?

        https://symfony.com/doc/current/frontend.html


        1. dastanaron_dev Автор
          13.04.2018 18:46

          Разговор про с коробки! Доставить можно все что угодно. И в Симфони правильно делают что не ставят в коробку. В последней версии вообще много чего выпилили с того, что было раньше, все можно поставить, но отдельно, и по мере надобности. Мне нравится такой подход. Но разговор шёл про «из коробки». Здесь не о чем спорить. Для многих типовых решений есть куча отдельных библиотек написанным самими SensioLab и сторонние решения.

          symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html

          Это совсем не то, что делает Yii. Этот генерирует только php файлы с классами, а у Yii это и модели и контроллеры сразу с данными и готовое сверстанное представление


          1. BoShurik
            13.04.2018 18:50

            https://github.com/symfony/website-skeleton/blob/4.0/composer.json


             "require": {
                    // ...
                    "symfony/webpack-encore-pack": "*",
                    // ...
                },
                "require-dev": {
                    // ...
                    "symfony/maker-bundle": "^1.0",
                    // ...
                },


            1. dastanaron_dev Автор
              13.04.2018 18:58

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

              Не поймите меня не правильно. Симфони я очень уважаю. Но для типовых проектов, которые мне приходилось делать быстрее сделать на Ларе или Юии. Симфони лучше подходит для планирования хорошей архитектуры и мощных нагруженных проектов. Для толстых проектов, совмещающих в себе кучу мелких, я бы бесспорно выбрал Симфони. А если писать что-то типа Алибабы, Ебэя или Что-то еще более крупное. Лучше вообще избегать фреймворков, поскольку тут очень важно продумать свою разумную архитектуру, чего не делает один человек. Не думаю что Гугл или Яндекс пишут на каких-то фреймворках, скорее разрабатывают свои. Но это лично мое мнение


              1. cawakharkov
                13.04.2018 19:02

                Сейчас большинство проектов делается согласно принципу “Api first”. А в нагружённом проекте вообще всегда зоопарк технологий а не фреймворк.


          1. BoShurik
            13.04.2018 20:57

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


          1. hudson
            13.04.2018 21:34

            Symfony начиная с версии 4 как раз следует парадигме «доставь все что тебе нужно». Чем-то напоминает Flask из мира python. На старте это готовый микрофреймворк, но собрать из него можно что угодно.

            Было ли это хорошим решением — время покажет. Лично мне нравится, хоть и непривычно что Doctrine и Twig по умолчанию отсутствуют.


      1. cawakharkov
        13.04.2018 18:50

        Что такое генератор интерфейса?
        Для фронта — есть и любой вешний без проблем подключается. Что должны делать эти хелперы а главное зачем? Тот же вопрос про данные.


      1. BoShurik
        13.04.2018 21:01

        Помельче: хелперы для работы с конфигами, или какими-то данными.

        Что вы под этим имеете в виду?


  1. cawakharkov
    13.04.2018 18:51

    Где вы видели, что в проекте используется только то, что есть в самом фреймворке?


    1. dastanaron_dev Автор
      13.04.2018 18:59

      Нигде не видели)


      1. cawakharkov
        13.04.2018 19:03

        Тогда к чему такая привязка к инструментам из коробки?


        1. dastanaron_dev Автор
          13.04.2018 19:46

          Потому что если сравнивать. То возможности самих фреймов. А если говорить о различных надстройках, то вообще можно придти к выводу что все имеют одинаковые возможности с разной реализацией просто.


          1. cawakharkov
            13.04.2018 19:51

            Как раз все дело в реализации, как по мне.


          1. VolCh
            14.04.2018 10:20

            Сравнивать можно и нужно не то, что из коробки (особенно если коробок много по факту, скажем различные edition типа web-edition, api-edition и т. п. или full-edition, standard-edition, micro-edition), а то, что предоставляет вендор прежде всего. Если в доках фреймворка X написано про фичу Y "перед использованием подключите Y с помощью composer req x/y", то это не повод исключать из сравнения.


  1. calg0n
    13.04.2018 21:28

    Сразу предупрежу вопрос о том, почему не рассматриваем Symfony.
    Дело в том, что Symfony более низкоуровневый фреймворк, который чаще берут для основы в крупных проектах, например таких, как написание собственного фреймворка для разработки.
    Ерунда какая-то написана. Мы используем Symfony и в крупных и в мелких проектах и никаких костылей вроде собственных фреймворков не пишем.
    Вы вероятно имели в виду бандлы, а не сам фреймворк. Из отдельных бандлов/либ да, можно набросать свой собственный фреймворк (в этом собственно прелесть модульной архитектуры) если уж очень колется, но только зачем? :)
    Его в принципе нельзя сравнивать с Laravel и Yii2, так как они используют его компоненты в своих реализациях.
    Ну вот вы сами ответили на свой вопрос.


    1. VolCh
      14.04.2018 10:22

      Бандлы как раз очень симфони-специфичная вещь, речь именно о компонентах.


  1. sayber
    13.04.2018 21:34
    +1

    В 2015г. я бы еще обратил внимание на Yii.
    На данный момент, не вижу в нем хотя бы одного плюса.
    Правда я фанат Symfony DDD/CQRS/Bus/EQ… Потому мое мнение совершенно бесполезно.

    На тему крупных проектов, видимо автор застрял в 2015-2016гг. и не знает о существовании Symfony 4.
    Соответственно, считать данный пост серьезным, совершенно нельзя.


    1. hudson
      13.04.2018 21:38
      +1

      Я бы отмотал еще лет 7 ) Если и сравнивать Yii то с Symfony 1.x, ZF1.x (год 2007-2008й). Кстати у Symfony тогда был админ-генератор из коробки))


      1. sayber
        13.04.2018 21:40

        Да, был. Но я в то время на Zend писал и осваивал Yii, который был в тренде.
        Но сейчас, выбор мой SF, но если смотреть на другие, то конечно laravel.
        Причина проста — организация кода, архитектурный принцип и конечно ioc.

        В добавок, удобно реализовать DDD. Хотя тоже надо будет поковыряться и написать обработчик для входящих данных, что бы использовать геттеры


        1. hudson
          13.04.2018 21:46

          Я тогда выбрал Symfony (из-за схожести с RoR, который тогда тоже был в тренде, но не только — делал несколько небольших проектов то на одном, то на другом фреймворке, сравнивал грабли). И не пожалел, вторая версия, хоть поначалу и казалась сложной, повернула мозги в правильном направлении.


        1. Anton_Zh
          14.04.2018 07:04

          Проектов настолько больших, чтобы DDD принес реальную пользу (ЧСВ не в счет) немного, так что ниша Yii/Laravel довольно большая.

          IoC есть и в Yii и в Laravel. В Yii в основном практикуется ServiceLocator. например вызов Yii::$app->get(); или Instance::ensure() в конструкторе хуже классического внедрения только в том плане, что нельзя будет класс оторвать от фреймворка, а это не так уж нужно если не пишешь библиотеку.


          1. VolCh
            14.04.2018 10:13

            Проектов настолько больших, чтобы DDD принес реальную пользу (ЧСВ не в счет) немного

            хуже классического внедрения только в том плане, что нельзя будет класс оторвать от фреймворка

            То есть возможность роста проекта настолько, что DDD начнёт приносить пользу вы априори исключаете, гвоздями прибивая классы проекта к фреймворку, на котором сложно работать с DDD?


            1. Anton_Zh
              14.04.2018 15:13

              По такой логике надо во все проекты DDD закладывать «на вырост», я не могу с этим согласиться, «на вырост» часто оказывается вредным.


              1. VolCh
                14.04.2018 15:29

                Я не про закладывание DDD, про непривязывание намертво основных частей приложения к фреймворку, который выбран здесь и сейчас. Закладывание возможности сменить фреймворк или его мажорную версию.


          1. sayber
            14.04.2018 14:28

            DDD — любой проект, где существует серьезная бизнес логика. Проекты, где важен бизнес а не ЧСВ разработчика.
            Сначала реализуется бизнес-логика, которая не зависит от приложения, затем делается остальное.
            Вот главная цель DDD.
            Конечно, применять в мелких сайтах и петпроектах не имеет смысла.
            Но я не говорю о таких проектах, их можно реализовать хоть на html и пару микросервисов. Я даже не считаю подобные проекты работой.

            Т.е. вывод прост, вы не представляете что такое DDD и для чего.
            Или просто не работали над серьезными бизнес-проектами с миллионными инвестициями.


            1. Anton_Zh
              14.04.2018 14:37

              Главная цель DDD это устранение сложностей с пониманием предметной области и создание реализации, максимально близкой к модели предметной области, чтобы ее удобно было понимать и поддерживать.

              По вашему серьезные проекты невозможны без DDD?) Большинство проектов на Yii не сделаны по DDD, их вы тоже не считаете работой?) Жгите дальше.


              1. sayber
                14.04.2018 14:49
                +1

                Нет, почему же.
                Можно написать хоть обычными функциями на PHP4 (делал банковскую CRM в 2007г.).
                Вы мне напомнили людей с развлекательных сайтов, которые читают первую строчку, затем среднюю и последнюю.

                Вообще — я не говорил, что YII нельзя использовать и это полное дерьмо.
                Я не писал, что невозможны серьезные проекты без DDD.

                Вы как западные политики, придумываете то что вам удобно.

                Почему для слепых котят, надо все пояснять и выделять жирным текстом?

                Конечно, применять в мелких сайтах и петпроектах не имеет смысла.
                Но я не говорю о таких проектах, их можно реализовать хоть на html и пару микросервисов. Я даже не считаю подобные проекты работой.


                1. Anton_Zh
                  14.04.2018 15:21

                  Вообще — я не говорил, что YII нельзя использовать и это полное дерьмо.
                  Я не писал, что невозможны серьезные проекты без DDD.

                  Вы как западные политики, придумываете то что вам удобно.

                  Почему для слепых котят, надо все пояснять и выделять жирным текстом?


                  Извините, я неправильно понял ваш комментарий.


              1. YaRobot
                14.04.2018 14:54

                Не вижу что кто-то писал, будто без ДДД невозможно реализовать крупное программное решение.
                Доменый слой существует для реализации логики в отрыве от данных и приложения.
                Вы пишите логику, основываясь на требованиях бизнеса. Домен, дает прекрасную возможность, подстраиваться под веяния бизнеса.


                1. Anton_Zh
                  14.04.2018 14:59

                  А без DDD вы логику на основе чего пишете?


                  1. YaRobot
                    14.04.2018 15:11

                    Как обычно, бестпрактик.
                    Но это к сожалению не дает возможности, быстро перестроить логику, если что то кардинально изменится.
                    Соответственно это время и деньги бизнеса.

                    Если вас смутила фраза

                    Вы пишите логику, основываясь на требованиях бизнеса.

                    То тут имелось ввиду, что в ДДД пишут, не именно вы =)
                    Пишу статью, образ речи сохраняется и в комментариях =)


                    1. Anton_Zh
                      14.04.2018 16:16

                      Я хотел сказать, что любые приложения всегда пишутся по требованиям бизнеса, DDD здесь не монополист. Да, по сравнению с обычными приложениями, в DDD код более абстрактный и иногда легче по нему понять сложную бизнес-схему. Но это актуально только для реально сложных проектов, там где логика простая, DDD привносит больше сложности, чем снимает. Основная цель DDD борьба со сложностью, но для этого нужно сначала убедиться в том, что эта сложность действительно есть и она будет доставлять проблемы.


                  1. VolCh
                    14.04.2018 15:37

                    Без DDD вы, грубо говоря, не выделяете бизнес-логику в отдельный слой, независимый ни от чего кроме бизнес-требований. Скажем, в типичном Yii/Laravel приложении бизнес-логика очень часто размазана между контроллерами (классами унаследованными от базового класса контроллера) и "моделями" (классами, унаследованными от базового класса ActiveRecord). И хорошо если бОльшая часть в "моделях", а не в контроллерах.


                    Выделение бизнес-логики в отдельный независимый слой в общем случае не только в случае DDD может применяться, но на практике если видишь такое выделение, то и другие технические паттерны DDD замечаешь почему-то.


                    1. Anton_Zh
                      14.04.2018 16:05

                      Скажем, в типичном Yii/Laravel приложении бизнес-логика очень часто размазана между контроллерами (классами унаследованными от базового класса контроллера) и «моделями» (классами, унаследованными от базового класса ActiveRecord). И хорошо если бОльшая часть в «моделях», а не в контроллерах.



                      Ну в таком случае можно сказать, что в DDD-проекте она размазана между сущностями и сервисами, и хорошо, если большая часть в сущностях, а не сервисах, чтоб не получились анемичные сущности.


                      1. VolCh
                        14.04.2018 19:27

                        Существенное отличие между нашими фразами — в вашей нет слов "унаследованного от базового класса". В DDD бизнес-логика размазана по слою бизнес-логики и ни от чего не зависит. В типичном Yii/Laravel приложении бизнес-логика размазана между моделью, совмещающей по определению бизнес- и инфраструктурную логики, и контроллерами, реализующими по определению часть UI-логики. И, главное, и там, и там она зависит от классов, предоставляемых фреймворком. Захотите поменять фреймворк (ну или проапгрейдить на мажорную версию) — придётся разбираться где бизнес-логика, а где UI или инфраструктурная.


                        На актуальных версиях Yii/Laravel/Zend/Symfony можно писать как приложения в которых бизнес-логика отделена от всего остального, так и приложения в которых практически вся кастомная логика в контроллере, но почему-то на Zend и Symfony отделяют гораздо чаще, чем на Yii/Laravel. Как мне кажется, это не просто случайное стечение обстоятельств, а вполне сознательное поощрение того или иного стиля ведущими разработчиками того или иного фреймворка.


                        1. Anton_Zh
                          15.04.2018 02:25

                          Я думаю, что это абсолютно нормально, когда для решения какой-то задачи берется популярный, поддерживаемый фреймворк и код зависит от него. В этом ничего плохого я не вижу и считаю это нормальным. Да, при смене мажорной версии придется приложить усилия, заменить какие-то вызовы, базовые классы, отрефакторить проект. C DDD эти усилия прикладываются наперед, но несколько в другом виде — абстракции. домена. Но и это спасет от рефакторинга лишь часть проекта. При замене фреймворка/мажорной версии все равно придется много переделывать. Инфраструктурный слой все равно придется переписать, а этот слой чаще получается даже намного толще доменного.
                          Я предпочитаю не закладывать наперед возможность смены фреймворка/мажорной версии, так как это порождает много абстракций, которые замедляют и усложняют разработку (надо больше думать для выделения хороших абстракций), чтобы потом облегчить гипотетическую смену фреймворка, которая может и не понадобиться вовсе. Некоторые проекты на Yii1 спокойно продолжают работать.

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


            1. Anton_Zh
              14.04.2018 14:54

              Правда я фанат Symfony DDD/CQRS/Bus/EQ…


              Вот, сразу виден фанатизм. Он ослепляет.

              Я пробовал применять DDD в проекте. Что получилось — то же самое что и было без DDD, только работы больше по абстракции домена. Кода стало реально больше. Оверхед был налицо, поэтому для себя я сделал вывод, что DDD нужно применять только тогда, когда есть проблемы коммуникации(!), домен реально сложный и нетиповой.

              О недостатках DDD в википедии


              1. sayber
                14.04.2018 15:03

                Несколько лет назад, мы потратили 4 месяца, на проектирование архитектуры доменого слоя для SF без кода.
                Доработали доктрину, реализовали сериалайзер и маппинг бандлы.

                На данный момент, проект полностью оторван от приложения. Т.е. домен можно использовать в любом другом месте, подгрузив только нужные зависимости.
                Слой приложения, полностью отдельный и не зависит от домена.
                Вместе же, это реализует API для HL++ проекта.
                Оверхеда какого либо нет. Правда это заслуга хорошо продуманной архитектуре и то о чем я писал выше.

                Я вам открою секрет, на текущий момент, я больше фанат Golang и laravel. Но это только в отрыве от бизнеса.


                1. Anton_Zh
                  14.04.2018 15:10

                  Несколько лет назад, мы потратили 4 месяца, на проектирование архитектуры доменого слоя для SF без кода.


                  4 месяца без кода, ну это большой риск. И что прототипов даже не писали?

                  На данный момент, проект полностью оторван от приложения. Т.е. домен можно использовать в любом другом месте, подгрузив только нужные зависимости.


                  Вот именно, что можно, но нужно ли? Вам это дало какой-то профит, если не секрет, какой? Повторно использовали домен в другом проекте? Так он же уникальный, разве нет? В чем именно получилась реальная выгода, если не секрет?


                  1. sayber
                    14.04.2018 15:23

                    Нет. Блок схемы в основном. Продумывали алгоритмы.
                    У нас было время, т.к. проект уже работал (кстати на YIi частично), но он не отвечал двум основным требованиям. Это нагрузка (на 50 обращениях уже не вытягивал именно PHP, не БД. До нас делали по доке проект), вторая проблема, это изменения поведения внешних клиентов которым поставляются данные (booking.com, trivago и др. букинг товарищи).

                    Время дали год для команды. Надо было придумать и реализовать проект с возможностью быстрой перестройки под тот или иной проект. Особенно это стало хорошо заметно на фоне санкций и нового закона о данных.

                    Профит — я уже сказал по сути. Быстрая смена работы под определенные бизнес-решения. Домен используется и в др. проекта, как вы верно заметили. Домен не совсем уникальный, он имеет модели, репозитории, логику для определенных вещей букинг бизнеса, что в 90% случаев одинаково.
                    Для использования домена в другом проекте (условие только SF), надо подменить для своих нужд хендлеры, если это требуется и/или объекты ответа заменить.
                    Слой приложения пишется свой, у каждого свои потребности.


                    1. Anton_Zh
                      14.04.2018 15:53

                      Признаю, в описанном случае DDD полезен.


              1. VolCh
                14.04.2018 15:40

                В каком плане "то же самое"? Если работы по абстракции больше, то значит не то же самое, а абстракция сильнее, нет?


                1. Anton_Zh
                  14.04.2018 15:59

                  «То же самое» — имеется ввиду реальная работа, которую выполняет код. Да, абстракция стала сильнее, но внедрять новые функциональные возможности, как ни странно, стало сложнее. Приходится думать, как новое ляжет на существующие абстракции, а если не ложится, приходится их модифицировать вместе со всем соответсвующим инфраструктурным кодом. Да и просто больше файлов надо просмотреть и отредактировать.
                  Сначала меня DDD увлек, я думал, он мне поможет упростить работу, а на практике оказалось нет. Проект не настолько сложный и большой, команда 3 человека в одном офисе.


      1. calg0n
        13.04.2018 21:45

        Даа. Админ-генератор был сказка. Мы вот в sf4 юзаем EasyAdmin и плюёмся :(
        Я так понимаю кроме жирной Сонаты и EasyAdmin больше вариантов нет?


        1. sayber
          13.04.2018 21:48

          Если и есть, то хуже по качеству.
          Хотя я особо не искал.
          SF в 99% используется для реализации API, остальное swagger + экспорт в postman.


        1. hudson
          13.04.2018 21:48

          Нормальных я не видел. EasyAdmin использую для чего-то совсем простого, в остальных случаях пишу свои решения. Sonata, при всем моем уважении к труду сообщества, слишком медленная и переусложненная. Я отказался от ее использования после долгих лет мучений… )


  1. Samouvazhektra
    13.04.2018 22:48

    Работа через фасады, большинства обширных классов Laravel. Такое сложное предложение, я поясню! Дело в том, что во многих классах фреймворка используется динамическое создание свойств и методов, в зависимости от каких-то условий.
    Проще привести пример. Мы объявляем класс модели работы с базой данных, которая является расширением стандартного класса Illuminate\Database\Eloquent\Model, в котором нет статических методов where, select и т.п., но на самом деле они есть и ими можно пользоваться. Вот такие чудеса. Дело в том, что такие методы образуются из так называемых фасадов, которые считывают обычные методы класса и превращают их в статические. А свойства получаются путем обращения к базе данных.

    Автор вообще не видит разницы между фасадами и магическими методами? Статью очень трудно воспринимать, так как автор явно поверхностно знаком с обоими фреймворками.


    Плюс Yii2 — в том что он очень лоялен к новичкам, можно генерацию из интерфейсов делать, без консоли, можно минимум js знать, тонны виджетов на каждый чих; и он же — большой минус так как тормозит развитие и изучение сопутствующего стека, оставляя зацикленными на jquery-bootstrap
    И очень не хватает для Yii2 аналога laracast


  1. Anton_Zh
    14.04.2018 06:56

    Да, Yii/Laravel + VueJs на мой взгляд сейчас очень актуальный и востребованный стек.
    Сам работаю с Yii, очень удобно.
    Про механизмы доступа к данным что-то ничего не написали.


  1. OnYourLips
    14.04.2018 10:13

    Большой функционал работает через фасады и IDE-системы не видят методов и свойств в некоторых классах, показывая предупреждения
    Вас никто не заставляет использовать фасады. В Laravel есть замечательный DI с автовайрингом и это предпочтительный способ связывания.

    Изучается немного сложнее Yii2
    С моей точнки зрения все как раз наоборот, из-за огромного количества обучающих материалов по Laravel, рассчитанных на новичков. Есть даже интерактивные курсы, где в процессе обучения надо писать код.

    А по поводу QueryBuilder'a скажу, что чистый доктриновский да, немного сложноватый, за счет непривычности описания в аннотациях
    Описывайте в yaml, так удобнее.


  1. ivorobioff
    15.04.2018 00:36

    И все же, не вижу проблем использование Symfony — он вполне прост из коробки, легко можно построить обычное приложение без особых усилий… думаю что страшилок про Symfony надо меньше читать и тогда все будет окей…


    1. VolCh
      15.04.2018 23:50

      Скорее впечатления от первых релизов второй ветки. Аутентификации с авторизациями чего стоили, да и в 4, наверное, самая сложная тема для начинающих.


  1. VolCh
    16.04.2018 00:15

    С лета 2013-го до лета 2017-го моей основной задачей была поддержка и развитие проекта на symfony 1.4. Он был популярным и поддерживаемым на время старта проекта. И процентов на 90 уверен, что он работает до сих пор, хотя и ведутся работы по уходу с него. Что я могу сказать: была бы там логика отделена от фреймворка (считая doctrine1 частью symfony 1) — не было бы острой нужды в уходе с него. Минимум годовую зарплату я получил за борьбу с сильной связанностью бизнес-логики и фреймворка. Там и других косяков в архитектуре хватало, и сам я немало костылей написал под убеждением «ещё пара месяцев и так или иначе развитие остановится» буквально с первого дня работы, но основная проблема была именно в отсутствии изоляции от фреймворка и orm. По самым моим пессимистичным оценкам, пару человеко-месяцев выделенных летом 2013-года на изоляцию, окупились бы только за счёт моих задач к лету 2017-го многократно.