В этой статье речь пойдет о разработке приложений на 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.
ссылка на оригинал статьи http://habrahabr.ru/post/273615/
Добавить комментарий