Pull to refresh

Разработка приложений на Yii2 без опыта — прямой путь в АД

Reading time7 min
Views75K


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

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



Небольшая предыстория
Года три назад я познакомился с отличным инструментом под названием Yii2 и стал тесно с ним работать. Вначале для обучения новым фитчам php5.3 и php.5.4 ну и в дальнейшем для реализации всех своих проектов. Тогда еще у меня были очень большие проблемы с архитектурой, хотя должен признать, что сейчас они тоже есть, но не в таких масштабах. Поэтому, когда я натыкался на множество ошибок, я не придавал им значений, а когда проект вырос, было уже поздно.

Итак приступим.



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

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

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

Процесс разработки приложения на Yii2
Установка Yii2 достаточна простая. С появлением composer установка почти любого инструмента простая. Единственное, что все портит это composer-asset-plugin, с ним у многих возникают проблемы. Кто-то забыл поставить, кто-то обновлялся и не сбросил кэш, в общем проблем и вопросов по этой теме много. Хотя я не буду записывать это в минус, просто скажу, что установка Yii2 достаточно простая.

Выбор шаблона приложения
Yii2 достаточно любезен, поэтому предлагает сразу несколько шаблонов для архитектуры. Классика, — это выбор между advanced и basic. Наверное каждый новичок видя первый раз Yii2, задумывался о вопросе какой-же шаблон выбрать?
Я делал несколько средних проектов на разных шаблонах и всегда натыкался на разные проблемы в каждом из них.

  • basic
    Не знаю как у Вас, но у меня возникал дискомфорт когда проект постоянно разрастался. Нужно было думать как красиво вынести админку, если ее организовать модулем, то появляется большая вложенность, чувство неудобства и еще если вдруг по какой-то причине нужно было бы добавить еще 1 приложение (по перспективе роста как в advanced) дискомфорт увеличивался.
  • advanced
    Как-бы решает дискомфорт с приложениями в basic, но появляется новый дискомфорт. У нас в проекте появляется тонна конфигов для каждого приложения + общие и все модели начинают делиться между приложениями и наследовать друг друга. Еще в некоторых случаях приходилось перекрывать реляции, чтобы дергать классы моделей текущего приложения, а не общего.

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

Примерно с этого момента мы уже взглянули (не ступили, а только посмотрели) на дорогу, которая ведет в АД.

Yii2 — современный mvc framework
Даже если предположить, что все, кто разрабатывает на Yii2 (хоть это далеко не так) следуют парадигме mvc, пишут тонкие контроллеры, жирные модели и не пишут логику в представлениях, работая с Yii2 вы все-равно уже в АДУ.

Дело в том, что разработчики самого Yii2, слишком дословно трактовали MVC при разработке инструмента. В результате модель получается таким божественным классом, который делает все. Модель обычно в лучших традициях унаследована от ActiveRecord, работает с формами, валидацией, содержит логику, реляции, еще одну логику, еще сценарии, и еще 10 логик на каждый сценарий и еще одну логику для логики логик.

Когда проект разрастается и у вас есть модель, которая скажем состоит из 5 сценариев, содержит очень много логики и еще в лучших традициях от нее зависит 80% всего вашего приложения. И тут появляется задача что-то изменить или добавить, а вы понимаете, что у вас не одна такая модель, а целых 10 и все они зависят между собой и чтобы что-то добавить нужно отрефакторить все это дело. Смотрите по сторонам, и видите дорогу с табличкой «Добро пожаловать в АД».

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

Несколько примеров из жизни (или добро пожаловать в АД):
  • В одном проекте я был свидетелем того, что разработчики придерживались идеи MVC, делали тонкие контроллеры и жирные модели. В результате чего можно было наблюдать несколько моделей из 10 000 — 15 000 строк кода, которые были связанны чуть ли не с большей половиной всего проекта. Естественно настал момент, когда все крестились и просто боялись их трогать, зная что если что-то сломают может полететь весь проект. Это не критично на небольшом проекте, но если проект набирает популярность и разрастается, ждите беды.
  • Если все модели наследуем от ActiveRecord, то на выходе по перспективе получаем так-же букет из проблем. Возможно будет такая ситуация, когда мы унаследуете frontend и backend модели от common моделей, которую в свою очередь от ActiveRecord. Но что будет если вдруг по мимо общей логики, нам потребуется разная логика в frontend и backend приложениях? Скорее всего начнутся перекрывания сценариев, событий таких как afterSave, beforeSave и много других интересных штук. С которыми я сталкивался почти везде.
  • ActiveForm, тут просто facepalm. Это не очень гибкая штука как и 90% виджетов Yii2, они рассчитаны на быструю разработку ну скажем прототипов или максимум админку. Но использовать эти виджеты в большом и сложном проекте не очень хорошая идея. Практически не реально воплощать в жизнь извращенные задачи клиентов. Еще как претензия, это то что разработчики Yii2 прилично смешали php код с js, это можно наблюдать в валидаторах. И на послед, это то что все поголовно зависит от jQuery. Не скажу, что это плохо, но есть еще такой замечательный framework как vanilla (если вы понимаете о чем я ;)).
  • Расширения. Что касается расширений Yii2 (конечно-же от сторонних разработчиков), то 99% этих расширений решают только примитивные стандартные задачи. Если возникает суровая серьезная задача, то в 99% случаях Вам придется писать все самому.
  • И таких примеров очень много.


Разумеется все эти моменты приходятся непосредственно именно на разработчиков. Однако, когда я начинал, я даже и представить не мог, что через год у меня будет более 80 моделей с перекрученной логикой и кучей, просто огромной кучей условий, чтобы хоть как-то "'это" работало. Рефактроинг превращается в АД, потому, что рекурсия зависимостей делает свое дело. Если как-то отрефактроить одну модель, за этим следует рефакторинг почти половины проекта.

Пожалуй самые главные минусы Yii2, которые в свое время мне подпортили жизнь
  • Слишком добрый и много плохого позволяет разработчику. В некоторых моментах даже провоцирует на пакость.
  • Большая связанность компонентов.
  • Изначально Yii2 не вводит такого понятия как слоистая архитектура. В результате чего появляются божественные модели в лучшем случае, ну а в худшем все разбросанно абы как.
  • DI. По сравнению с symfony2 (или 3) в Yii2 DI это игрушка для младенца.
  • ActiveForm. А именно JS api. Хотя на валидаторы чуть-чуть нагрешить тоже можно.
  • Сторонние расширения. В 99% решают только примитивные стандартные задачи.


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

Несколько советов для тех, кто работает с Yii2
  • Пишите хотя-бы юнит тесты. Это здорово выручит, особенно когда это большой проект на Yii2, где все связанно.
  • Предотвращайте появление божественных жирных моделей
  • Не наследуйте все подряд от ActiveRecord
  • Не пишите всю логику в моделях, разделяйте модели на сервисы (на отдельные классы).
  • Старайтесь как можно сильнее избегать связанности.
  • Не пишите логику в видах и контроллерах.
  • По вечерам уделите время Symfony 2(или 3), чтобы расширить кругозор.


Еще в качестве дополнения я хочу ответить на некоторые популярные вопросы:

Какой framework выбрать новичку?
Профессиональный разработчик может выбрать абсолютно любой инструмент для разработки проекта. Что касается новичка, я бы рекомендовал брать Symfony 3. Просто поверьте на слово. Да будет тяжело, да будет желание уйти, да будут жалобы. Нужно перетерпеть и просто сидеть на Symfony 3. И так до тех пор пока вы не разберетесь с архитектурой и не получите хорошие знания «как это работает». После этого вы сможете избежать многих ошибок в Yii2.

Подходит ли Yii2 для больших проектов ?
Да. Yii2, как и любой другой современный инструмент подходит для любого проекта, но обязательным условием должно быть то, что вы или представители вашей команды хорошие инженеры. Иначе, когда проект разрастется вы проснетесь в АДУ.

Symfony2 vs Yii2, что круче ?
Раньше я всегда двумя руками защищал Yii2 и грешил, что Symfony2 медленная, жирная, в ней много чего не нужного и тп. Обращаюсь ко всем симфонистам: Ребята простите, я никогда так не ошибался.

Что касается ответа на этот вопрос, как говорил Александр Макаров на одной из конференций: «Yii2, это другая ниша».
Сравнивая Symfony2 (или 3) с Yii2, это наверно как сравнивать велосипед с автомобилем.
В теории на велосипеде тоже можно проехать 500 км., однако будьте готовы запастись клеем и заплатками.
И при этом тем не менее многие бы сейчас с удовольствием расслабились и покатались на велосипеде.

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

Далее, если тема кому-то интересна, то в следующей статье я попробую рассказать о том, как можно встать на путь истинный и более-менее красиво работать с моделями в стиле Yii2.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 46: ↑25 and ↓21+4
Comments130

Articles