Yii неприятные моменты

1. Собственные вендоры - зачем, ведь уже давно есть composer

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

Yii неприятные моменты

3. Архитектура - виджеты, которые вместо того, чтобы быть сконфигурированы заранее, они конфигурируются в момент использования (runtime) и как вы понимаете, их уже не сконфигурировать:

Yii неприятные моменты

4. Архитектура - поверх внутренних вендоров написаны классы ядра Yii и в них задана конфигурация данных вендоров, которую изменить бывает сложно, а случае с сериализованностью (см. пункт 1) или использованием виджета (см. пункт 3) просто невозможно, например: 

vendor/yiisoft/yii/framework/web/widgets/CHtmlPurifier.php а именно: \CHtmlPurifier::createNewHtmlPurifierInstance

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 указываю:

error_reporting(E_ERROR | E_PARSE | E_COMPILE_ERROR);

Однако, оказалось в Yii сделать это не так просто, покопавшись я обнаружил, что объявленные в index.php константы:

define('YII_ENABLE_ERROR_HANDLER',false);
define('YII_ENABLE_EXCEPTION_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.',
                        array('{class}'=>get_class($this), '{property}'=>$name)));

Как мы знаем, многое уже написано и дорабатывать желания нет, а Yii строг и отменить эту строгость никак не дает, хотя ситуация рядовая и всё работает например без объявления переменных в классе. Написание такого кода я не поощряю, но и не настаиваю на другом, ведь в мануалах PHP тоже нет маниакальных преследований плохого кода, а я заставлять других писать "правильный" код не собираюсь, кому интересно учить других.

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

Источники: 1 - 2

Оцени публикацию:
  • 3,12
Оценили человек: 3

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2018 YaPro.Ru

Главная » Веб-мастеру » PHP »