Эта версия обновлена не только благодаря ежедневному исправлению ошибок, но также включает улучшение производительности базовых операций с данными, а также добавление новых валидаторов, HTTP-валидаторов и перечней значений.
// Из-за ограничений по объему приведены только некоторые примеры валидации, полный список доступен в документации
@Decimal(min=-0.01, max=999.99, accuracy=2, message="Дробное число должно быть больше либо равно {-0.01}, меньше либо равно {999.99}. Допустимое количество знаков после запятой - {2}. Текущее значение: {:value}")
<?php
namespace ImiDemo\HttpDemo\MainServer\Enum;
use Imi\Enum\BaseEnum;
use Imi\Enum\Annotation\EnumItem;
class Status extends BaseEnum
{
/**
* @EnumItem("Correct")
*/
const YES = 1;
/**
* @EnumItem("Incorrect")
*/
const NO = 0;
}
// Пример использования:
// Получение значения константы по имени
Status::getValue('YES');
// Получение текстового описания по значению
Status::getText(Status::YES);
// Получение объекта аннотации EnumItem по значению
Status::getData(Status::YES);
// Получение всех имён констант в перечне
Status::getNames();
// Получение всех значений констант в перечне
Status::getValues();
Worker::isTask()
dev/ext
, который генерирует файлы помощи для IDEbuildRuntime
__construct -> injectProps -> __init
AroundJoinPoint->proceed()
теперь принимает параметрыIMI.MAIN_SERVER.WORKER.START.APP
, которое выполнялось только один разСодержание может содержать违规信息
Поскольку в данном случае есть только одно предложение на китайском языке, которое требуется перевести на русский язык, то результат будет следующим:
Содержание может содержать незаконную информацию.
В конце имени пула соединений добавляется
.slave
, что указывает на использование реплики; этот параметр необязательный; если он указан, то по умолчанию запросы выполняются через реплику, а изменения — через основной сервер; в рамках транзакций все операции выполняются через основной сервер.
Добавлены события до и после парсинга данных модели (BeforeParseData
, AfterParseData
).
Добавлен интерфейс прослушивания события ModelEvents::AFTER_QUERY
.
Добавлена поддержка аннотации ExtractProperty
для выделения свойств полей в текущую модель.
Добавлены аннотации конфигурации сериализации моделей (Serializable
, Serializables
).
Добавлена поддержка аннотации Transaction
для установки типа транзакции и необходимости автоматической отправки.
Transaction(autoCommit="Автоматическая отправка транзакции true/false, по умолчанию true")
Типы транзакций:
Транзакция с вложением (по умолчанию)
Transaction(type=TransactionType::NESTING)
Метод должен вызываться внутри транзакции
Transaction(type=TransactionType::REQUIREMENT)
Если нет открытой транзакции, она будет открыта
Transaction(type=TransactionType::AUTO)
Добавлена поддержка команд scan
, object
, sort
, migrate
, hscan
, sscan
, zscan
для использования Swoole Redis.
Добавлен вывод информации о системе, PHP, Swoole и часовых поясах при запуске.
Добавлен вывод количества рабочих процессов при запуске сервиса.
Изменены CLASS, get_called_class() на объектно-ориентированный стиль.
Поддержка передачи параметров по ссылке в EventParam.
Поддержка изменения модели в событии ModelEvents::AFTER_FIND.
Добавлено обработки ошибок при использовании аннотации Transaction.
Добавлено откатывание транзакций при закрытии соединений.
При использовании аннотации Transaction в модели, если имя пула соединений не указано, используется имя пула соединений модели.
Добавлено значение, возвращаемое методом open ресурса базы данных.
Улучшено обнаружение ошибок в Db.
Изменён и улучшен пул соединений, теперь выбрасывается исключение при неудачном получении ресурса.
Изменён формат представления SQL информации.
Добавлены интерфейсы IHashCode и THashCode для хранения ресурсов пула соединений.
Изменены названия атрибутов класса EventParam для снижения вероятности конфликта.
Изменены правила названий ключей Redis (контекст соединения, группировка соединений, Session).
Изменено хранение контекста соединения в виде HASH.
Изменено хранение группировки соединений в виде SET.
Исправлены проблемы вызова событий в неконстантных методах модели.
Исправлены проблемы вызова метода query() в неконстантных методах модели.
Исправлены проблемы удаления связанных записей при обновлении модели.
Исправлены проблемы сериализации модели.
Исправлены проблемы использования метода IEvent с static.
Исправлены потенциальные проблемы с возвратом значений по ссылке.
Было:
Имя_класса_Имя_события
, стало:Имя_класса:Имя_события
В связи с приближающимся Днем осеннего освещения imi продолжает развиваться, и было решено повысить версию до v0.1.x
от v0.0.x
, всё ещё находясь в стадии активной разработки.
Желаем всем приятного отдыха!~
Поддержка полиморфизма моделей один-к-одному, один-ко-многим и многие-ко-многим
Поддержка позднего запроса связанных моделей
Введение использования @AutoSelect(alwaysShow=false)
, что позволяет скрывать поля после сериализации, которые не были автоматически запрошены
Форматирование кода, замена табуляции пробелами
Использование более элегантного способа реализации события IMI.APP.INIT
Улучшение сообщений генератора моделей о создании, перезаписи и пропуске
Исправление проблемы valid()
Исправление ошибочного определения пути горячей перезагрузки в некоторых случаях
Добавлена поддержка моделей отношений один-к-одному, один-ко-многим, многие-ко-многим (CRUD)
Добавлена поддержка корутин Redis с отложенным получением пакетов
Добавлена поддержка корутин MySQL с отложенным получением пакетов
Добавлен вывод иконки imi при запуске инструмента
Добавлено событие инициализации проекта (до выполнения которого запросы не будут обрабатываться)
Добавлена поддержка методов setData, setField, setFieldExp, setFieldInc, setFieldDec в Query для баз данных
Улучшение части кода
Дополнение методов интерфейса IQuery
Исправление ошибки возврата значения при использовании контейнерной инициализации класса (не поддерживаются ссылочные возвращаемые значения, исправлена только ошибка)
Исправление получения загруженных файлов без имени поля формы
Изменение типа возвращаемого значения в комментариях метода getUploadedFiles для поддержки подсказок IDE
Исправление типа $server в ITaskHandler
Основной поддержкой стала модель Phar; после тестирования было замечено значительное увеличение скорости запуска при использовании сетевых монтированных дисков, а также небольшое повышение скорости запуска с локальных жестких дисков.
Добавлена поддержка Phar
Добавлена возможность определения виртуальных полей моделей, не участвующих в операциях с базой данных
Добавлены события до и после выполнения запросов модели
Добавлены события до и после инициализации проекта и компонентов при старте
Добавлены события до и после инициализации Worker процесса
Добавлены методы App::setLoader()
и App::getLoader()
Изменены названия, улучшены комментарии
Изменено отображение ошибок командной строки, теперь можно просматривать трассировки ошибок
Добавлено проверение и сообщение об отсутствии пространства имён проекта
Добавлено проверение успешного начала транзакций в Coroutine MySQL
Добавлено проверение перед откатом транзакции с помощью аннотации @Transaction
Изменён тип возвращаемого значения метода getResource()
пула соединений
Изменено название конфигурации сервера с server_xxx
на server.xxx
Создана обёртка Tool
класса, детали запуска инструмента помещены внутрь Tool
класса
Улучшена точность определения пути директорий методом Imi::getNamespacePath()
Удалена зависимость метода ModelManager::getFields()
от RequestContext
Исправлен баг бесконечного перезапуска при активированном состоянии 'status' => false
Исправлен баг обработки протокола protocol://
в методе File::path()
Исправлены ошибки в инструментальном классе
server_xxx
, заменено на server.xxx
Поддержка адаптации Swoole 4.1.0 для однокнопочного перехода в корутины
Добавлена поддержка пула процессов
При создании модели, если директория отсутствует, она автоматически создаётся
Добавлен метод ProcessManager::runWithManager
, который можно использовать в событии IMI.SERVERS.CREATE.AFTER
Добавлены методы Result->getSql()
и Result->getStatement()
При инициализации Manager, Worker, Process процессов заново сеян случайные числа
Для метода CoroutineChannelManager::pop()
добавлен параметр $timeout
Добавлена возможность инициализировать пул соединений при запуске пользовательского процесса
Добавлена поддержка ограничения одного экземпляра процесса с помощью блокировки файла
Улучшены логика инициализации ConnectContext
и Group Redis
Горячее обновление процессов теперь привязывается к процессу Manager
Улучшен генератор моделей, по умолчанию первый поле является первичным ключом
Совместимость пула с Swoole 4.0.3 и выше
Улучшена точность отслеживания ошибок
Обработка полей типа bit
базы данных как bool
Улучшена логика проверки null значений при сохранении модели
Изменён обработчик события WorkerStart
Изменён обработчик кэширования каталогов файлов перечислений и классов
Улучшена поддержка двух названий полей при обновлении модели
Улучшена конвертация данных в массив перед обновлением модели
Улучшена логика обработки аргументов при инициализации класса через BeanFactory
Изменён текст запуска горячего обновления процессов
Изменение: сканирование проектных классов в событии IMI.INITED
, горячий перезапуск действителен только для серверных классов
Внедрена функциональность получения командной строки imi
Улучшение Result->get()
, Result->getArray()
возвращают null
, когда данные отсутствуют
Добавлены сообщения о начале горячего обновления процессов
Внедрены методы кэширования класса Bean
Исправлено возможное прекращение работы горячего обновления при использовании Swoole ≤ 4.0.4
Исправлена проблема конфигурации подключения к базе данных, использование username
для указания имени пользователя
Исправлено событие ManagerStop
, которое может не вызываться
Исправлен метод CoroutineChannelManager::stats()
Исправлено чтение Redis хранилища ConnectContext
Исправлен баг генератора моделей nullable
Исправлено отсутствие импорта пространства имен
Исправлены проблемы модели с условием where
Исправлены проблемы класса kv-хранения
Исправлены ошибки инициализации кэша
Исправлены проблемы с полями, не относящимися к модели
Отменена автоматическая запись журнала, теперь журналы отправляются в реальном времени в обработчик
Отменено поле lastTrace
в журнале
Добавлена поддержка {errorFile}
, {errorLine}
RT, практическая работа продолжается, IMI будет становиться всё лучше!
Добавлен метод TcpController->encodeMessage()
Добавлена информация о запуске сервера
Добавлено определение имени командной строки
Добавлено событие IMI.MAIN_SERVER.WORKER.START.APP
Добавлена поддержка атрибутов после генерации модели для подсказок IDE
Добавлены события CRUD для моделей
Добавлен метод set
модели, поддерживающий присвоение значений из массива
Добавлен обработчик HTTP 404
Добавлена поддержка автоматических транзакций
Добавлена поддержка проверки isset
для свойств модели
Улучшено отображение прогресса генерации модели и завершение сообщений
Исправлена проблема горячего перезапуска сервера при использовании опции -appNamespace
Исправлена ошибка местоположения файла журнала ошибок
Исправлены проблемы с методом save
модели
Изменён файл записи PID процесса
Оптимизация поддержки логирования сервера
Изменено очистка кэша Beans текущего worker процесса
Исправлены проблемы использования корутин в командной строке
Продолжена работа над исправлением проблем загрузки аннотаций проекта
Удалена загрузка аннотаций проекта при старте, теперь они загружаются в инструментах
Исправлены проблемы удаления кэшированных Beans
Исправлены проблемы с методом Model::select()
, вызывающие ошибки при отсутствии условий
Исправлены проблемы загрузки аннотаций проекта при старте
Улучшены механизмы захвата ошибок и исключений
Исправлены проблемы, препятствующие распространению событий, что могло бы привести к отказу одного компонента
Теперь Logger
использует единую операцию App::getBean()
Изменено поведение JsonErrorHandler
по умолчанию для выбрасывания исключений
Сохранение журналов критических ошибок
Добавлены процессы обработки журналов ошибок и исключений
Исправлены проблемы с небольшим значением $context
в журнале
Исправлены проблемы последнего трассировки журнала
Исправлены проблемы выполнения запросов до полной инициализации корутин в WorkerStart
Исправлены проблемы последней трассировки журнала
Изменено описание версии PSR проекта в composer.json
Исправлены проблемы с отложенным обработкой пакетов
Исправлены проблемы обработки необъектных данных KVStorage
Исправлены проблемы с конфигурацией middleware в маршрутах HTTP
Добавлена поддержка создания WebSocket/TCP/UDP приложений с использованием middleware + контроллеров
Добавлена поддержка долгоживущих данных соединений
Добавлен метод получения общего количества соединений в группе
Добавлен атрибут redisDb для указания базы данных в Redis группе
Добавлено слушание события WorkerError
Открыт доступ к некоторым методам BeanProxy
Поддержка генерации моделей с представлениями
В классе сервера imi добавлен метод getSwoolePort()
Улучшены поля и методы модели, добавлены аннотации полей базы данных для лучшего понимания
Оптимизированы операции update/delete/save модели базы данных, теперь при отсутствии первичного ключа могут возникнуть исключения
Переименовано work в worker
Улучшено управление транзакциями Redis
Логирование данных соединений и данных сердцебиения Redis используется в рамках транзакций для защиты от крайних случаев
Добавлен параметр $reactorID в событие закрытия сервера close
Выделен метод получения ID процесса в утилиты
Исправлена проблема с префиксами при генерации моделей
Исправлены ошибки обработки условий IN и NOT IN запросами базы данных
Исправлена проблема очистки кэша класса Bean
Добавлена поддержка использования контроллеров для разработки WebSocket-сервисов
Добавлена поддержка группировки логики соединений WebSocket
Добавлен механизм кэширования маршрутов HTTP
Теперь метод Session::get() без передачи аргументов возвращает все данные
Добавлена реализация сериализации и десериализации встроенных сессий PHP
Поддерживается форма параметра a.b.c в сессиях, где Session::get('a.b.c') эквивалентна Session::get('a')['b']['c']
Добавлена поддержка префикса сессии
Добавлена возможность использовать PoolManager::use() вне контекста запроса RequestContext
Изменено создание контейнера в RequestContext на требуемое время
По умолчанию timeout для синхронизации Redis подключения изменён на 68 лет (абсолютно достаточно! flag!)
Исправлена проблема отсутствия значения по умолчанию для параметров AtomicManager::sub()
Исправлена проблема ошибочного доступа к сессии при параллельном использовании
Исправлены проблемы LazyArrayObject
Исправлена ошибка местоположения установки имени процесса
Исправлено правописание одного метода
Устранены возможные повторения имён переменных в BeanFactory
Оптимизирована логика выполнения recv() для задержки получения данных
Обновлены и оптимизированы события сервера
Изменено использование eval() на include для кэшированных файлов при создании экземпляров класса Bean
Регулярное обновление, празднуем выход на биржу Xiaomi! imi: люби ми, мой ми
Добавлена возможность автоматического восстановления соединения при отключении пулов ресурсов
Добавлена поддержка модели $model->propertyName
для чтения и записи
Реализован локальный аннотированный middleware с конфигурацией
Добавлена возможность горячего перезапуска с очисткой кэша APC и Opcache
Добавлен атрибут baseDir
в аннотацию @View
для установки базового пути
В классе ServerRequest
добавлены значения по умолчанию для свойств
Добавлены стандартные порты протоколов в методах Uri
При запуске сервера удаляются ненужные объекты
Исправлены ошибки, связанные с моделями
Исправлена ошибка запуска процесса
Исправлена обработка заголовков PSR-7
Изменено время вызова конструктора при создании экземпляров BeanFactory
Исправлена проблема с дефолтными значениями при создании экземпляров
Исправлены ошибки преобразования Uri
в строку
Исправлено сообщение об ошибке при передаче массива в withAddedHeader()
Изменены параметры метода Imi\Util\File::path()
на переменные, что позволяет объединять бесконечное количество путей
Срочный ремонт ошибки
Настройка процесса загрузки фреймворка
Добавление командной строки для запуска службы, остановки службы и повторной загрузки службы
Добавление поддержки горячей перезагрузки бизнес-кода (два способа выбора: время изменения файла / расширение inotify)
Добавление поддержки использования аннотаций для определения и отправки задач
Добавление поддержки создания и выполнения процессов
Преобразование асинхронного записи в файл с использованием потока вместо фонового режима для драйвера логирования файлов
PHP-рендеринг шаблонов проверяет, является ли параметр массивом, чтобы избежать ошибок при других типах данных
Изменение момента загрузки аннотаций сервера на событие WorkerStart
Удаление ненужных классов
Временная ошибка при отсутствии sessionid во время доступа исправлена
Исправлен баг при неверной работе приоритета аннотации @Listener
Исправлен баг при использовании верхнего регистра первой буквы в каскадном имени
Исправлен баг при выводе сообщения об ошибке при использовании параметра -h для инструмента без параметров
Обновление зависимостей фреймворка: php >= 7.1 + swoole >= 4.0.0 (ранее использовались php 7.0 + swoole 2.2.0)
Добавлен Redis-модуль
Добавлена методика двойной camel-case нотации
Добавлены методы создания файлов и директорий
Добавлена возможность автоматического создания директорий в классах работы с сессиями
Добавлена поддержка сброса пула ресурсов
Улучшено производительство методики конвертации в camel-case нотацию
Изменены свойства и методы, связанные с ключами таблицы памяти, чтобы избежать конфликтов с полями
Исправлена проблема, при которой задачи всегда отправлялись в одинаковый процесс task
Исправлена проблема BaseAsyncPool->tryGetResource()
Первая версия