Yii неприятные моменты |
1. Собственные вендоры - зачем, ведь уже давно есть composer 2. Вендоры засериализованы - хочешь узнать кто создает объект класса, не получится, брейкпоинт не поставить, ведь объекты создаются магически 3. Архитектура - виджеты, которые вместо того, чтобы быть сконфигурированы заранее, они конфигурируются в момент использования (runtime) и как вы понимаете, их уже не сконфигурировать: 4. Архитектура - поверх внутренних вендоров написаны классы ядра Yii и в них задана конфигурация данных вендоров, которую изменить бывает сложно, а случае с сериализованностью (см. пункт 1) или использованием виджета (см. пункт 3) просто невозможно, например:
5. Неудобная работа с транзакциямиПо этой проблеме, решил написать, как сделать так, чтобы было хорошо, а именно, нужно Yii научить нескольким хорошим вещам: a) Если транзакция открыта, то повтотрый вызов Yii::app()->db->beginTransaction(); не должен пытаться открыть еще одну транзакцию, потому что PDO не умеет открывать более одной транзакции в рамках одного подключения. Это нужно, чтобы не заботиться о переписпользовании методов, в которых открывается транзакция. b) Реализовать правильный откат транзакций https://habr.com/post/198100/ c) Возможно будет правильным сделать так, чтобы вызов $transaction->rollback(); после откатки выбрасывал эксепшен. Это может пригодится в тех случаях, когда например у нас есть функция Х, в данной функции делается beginTransaction и rollback(), но после rollback() функция не выбрасывает эксепшен и не возвращает информацию о том, что функция X завершилась неудачей. Но, даже если функция X возвращает информацию о том, что выполнилась неудачно, то не факт, что в месте, в котором вызывается X есть обработка результата, которую возвращает функция Х 6. Yii не дает игнорировать NoticeМне удобно работать с кодом, когда я PHP указываю:
Однако, оказалось в Yii сделать это не так просто, покопавшись я обнаружил, что объявленные в index.php константы: define('YII_ENABLE_ERROR_HANDLER',false); действительно отменяют слежку за Notice. Однако, Notice который возник у меня не относится к Notice в том смысле, какой придал бы ей стандартный подход PHP: Fatal error: Uncaught exception 'CException' with message 'Property "URL.pages" is not defined. Yii выдает Fatal error потому, что у него в CComponent есть метод-проверки __get, который проверяет наличие изначально объявленных свойств в Вашем классе (это по мнению Yii обязательно). Чтобы игнорировать подобный Notice можно переопределить в файле /YiiRoot/framework/base/CComponent.php метода __get удалив в своей имплементации, следующий код: throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.', Как мы знаем, многое уже написано и дорабатывать желания нет, а Yii строг и отменить эту строгость никак не дает, хотя ситуация рядовая и всё работает например без объявления переменных в классе. Написание такого кода я не поощряю, но и не настаиваю на другом, ведь в мануалах PHP тоже нет маниакальных преследований плохого кода, а я заставлять других писать "правильный" код не собираюсь, кому интересно учить других. Всем удачки и осторожнее с выбором фрейморка ;) Мое решение - не использовать тяжеловесные фреймворки, по возможности использовать чистые компоненты. |
|
Похожие статьи: |
Справочники и учебники: |
« opcache - мои тесты | PDO нюансы » |
Главная | PHP | MySQL | Unix | JavaScript | Desktop | Дизайн | Продвижение | Другое |
X |
Новые заметки:→ Почему задачи выполняют долго → Равномерное распределение данных |
Последние комменты:19.08.2018 18:57, 100 комментов
14.08.2018 10:43, 1 коммент
09.08.2018 06:02, 309 комментов
08.08.2018 02:52, 1 коммент
25.07.2018 10:07, 2 коммента
|
Yapro CMS:→ Плагины
|