Хроники Yii3
623 subscribers
43 photos
1.7K links
Описание процесса разработки фреймворка из первых рук 😎

Обсуждение:
https://yangx.top/yii3ru

Сводка по всем пакетам:
https://www.yiiframework.com/status/3.0

Поддержать разработчиков:
https://opencollective.com/yiisoft
加入频道
⚡️ #yiisoftData

В пакете Yii Data подчистили и адаптировали тесты к PHP 8.1 (PR).
⚡️ #yiisoftRbac #yiisoftRbacPhp #yiisoftDemo

Продолжаем рефакторинг Yii Role-Based Access Control (PR).

RolesStorageInterface переименован в ItemsStorageInterface, а также переименованы методы:
getItems()getAll()
getItemByName()
get()
addItem()
add()
updateItem()
update()
removeItem()
remove()
getChildren()
getAllChildren()
getRoleByName()
getRole()
getPermissionByName()
getPermission()
getChildrenByName()
getChildren()
getRuleByName()
getRule()

• В методах removeChildren(), removeChild(), addChild() и remove() интерфейса ItemsStorageInterface в качестве аргументов вместо объектов элементов RBAC теперь используются их имена.

• В интерфейсе AssignmentsStorageInterface переименованы методы:
getUserAssignments()getByUserId()
removeUserAssignments()
removeByUserId()
removeItemAssignments()
removeByItemName()

• В методах get(), add() и remove() интерфейса AssignmentsStorageInterface изменён порядок методов:
string $userId, string $itemNamestring $itemName, string $userId

• В RBAC-менеджере Manager объекты элементов RBAC заменены на их имена в качестве аргументов в следующих методах:
canAddChild()
addChild()
removeChild()
removeChildren()
hasChild()
assign()
revoke()
removeRole()
removePermission()

• В RBAC-менеджере Manager переименованы методы:
getUserIdsByRole()getUserIdsByRoleName()
getPermissionsByUser()
getPermissionsByUserId
getPermissionsByRole()
getPermissionsByRoleName()
getRolesByUser()
getRolesByUserId()

• Исправлена ошибка в методе Manager::getDefaultRoles(): теперь возвращаются роли из хранилища, а не создаются новые.

Соответствующие изменения внесены в Yii RBAC PHP File Storage (PR) и демо веб-приложения (PR).
👍4
⚡️ #yiisoftYiiDebug

Несколько изменений в Yii Debug (PR):

• Стиль именования ключей в отладочной информации изменён на camelCase.

EventCollector, LogCollector, MiddlewareCollector и ServiceCollector теперь дополнительно реализуют интерфейс IndexCollectorInterface.

• В индексные данные RouterCollector добавлено имя текущего маршрута.

• В индексные данные ConsoleAppInfoCollector добавлена версия PHP.
👍3
⚡️ #yiisoftView

В пакете Yii View перенесли язык и тему в состояние сервисов View и WebView, сохраняемое при клонировании (PR, PR).

Соответственно переименовали методы:
withTheme()setTheme()
withLanguage()
setLanguage()
👍1
⚡️ #yiisoftForm

Несколько улучшений в Yii Form:

• У полей добавлен метод replaceIndividualToken() (PR).

• Актуализированы примеры в документации и улучшены описания в doc-блоках (PR).
⚡️ #yiisoftApp

В шаблоне веб-приложения убрали зависимость от Yii Bulma и немного изменили оформление стартовой страницы (PR).
👍4🤔4😱2
#yiisoftView #МажорныйРелиз #Релиз

🎁 Yii View 5.0.0

• Добавлено состояние сервисов View и WebView, которое сохраняется при клонировании самих сервисов (в том числе когда используются методы with*()), то есть клонированный объект будет использовать те же данные, что и исходный. Это позволяет, например, получить WebView в контроллере из контейнера с помощью DI и изменить его контекст:

final class BlogController {
private WebView $view;
public function __construct (WebView $view) {
$this->view = $view->withContextPath(__DIR__.'/views');
}
}

... а затем зарегистрировать CSS в виджете:

final class LastPosts extends Widget 
{
private WebView $view;
public function __construct (WebView $view) {
$this->view = $view;
}
protected function run(): string
{
...
$this->view->registerCss('.lastPosts { background: #f1f1f1; }');
...
}
}

Состояние View включает в себя: параметры, блоки, тему и язык.

Состояние WebView включает в себя: параметры, блоки, тему, язык, заголовок страницы, meta- и link-теги, JS/CSS строки и JS/CSS файлы.

Для клонирования View или WebView вместе с состоянием можно использовать метод withClearedState(), который дополнительно очищает клонированное состояние объекта:

$view = $view->withClearedState();

• Добавлена простая реализация интерфейса ViewContextInterface — класс ViewContext, который принимает в конструкторе путь к контексту.

• Добавлены методы View::withContextPath() и WebView::withContextPath() позволяющие задать контекст в виде пути к папке с представлениями.

• Добавлены методы View::addToParameter() и WebView::addToParameter(), которые позволяют добавить новый элемент к параметру, являющемся массивом. Эти методы удобно использовать, например, для «хлебных крошек»:

// Добавить крошки в представлении
$this->addToArrayParameter('breadcrumbs', $item1, $item2);

• В интерфейсе ViewInterface и его реализациях View и WebView мутабельный метод setPlaceholderSalt() заменён на иммутабельный withPlaceholderSalt().

• В интерфейсе ViewInterface и его реализациях View и WebView иммутабельные методы withTheme() и withLanguage() заменены на мутабельные, соответственно setTheme() и setLanguage().

• Доработан текучий интерфейс во ViewInterface, View и WebView: теперь все сеттеры (регистрация CSS/JS, удаление параметра, удаление блока и прочие) возвращают сам объект.

• В конфигурации пакета исправлена функция сброса состояния объектов: теперь после сброса в сервисы View и WebView добавляются параметры по-умолчанию.
👍4
⚡️ #yiisoftYiiDebugViewer #yiisoftDemo

Порефакторили Yii Debug Viewer и добавили тулбар, который можно добавить в приложение с помощью новой мидлвари ToolbarMiddleware (PR, PR).

Тулбар уже добавлен в демо веб-приложения (PR).
👍8
#yiisoftYiiView #ПатчРелиз #Релиз

🎁 Yii View Extension 4.0.3

• Добавлена поддержка yiisoft/view версии 5.0 (PR).
#yiisoftMailer #ПатчРелиз #Релиз

🎁 Yii Mailer Library 3.0.3

• Добавлена поддержка yiisoft/view версии 5.0 (PR).
#yiisoftErrorHandler #ПатчРелиз #Релиз

🎁 Yii Error Handler 2.0.2

• Исправлен JSON-рендеринг в случае, когда брошено исключение о рекурсии, для этого в функции json_encode заменили опцию JSON_THROW_ON_ERROR на JSON_PARTIAL_OUTPUT_ON_ERROR (PR).
👍1
⚡️ #yiisoftRbac #yiisoftRbacPhp

В интерфейсе ItemsStorageInterface пакета Yii Role-Based Access Control заменили метод getAllChildren() на getParents() (PR).

Соответствующим образом адаптировали хранилище Yii RBAC PHP File Storage (PR).
⚡️ #yiisoftYiiDbMigration

В пакете Yii DB Migration добавили поддержку Yii View версии 5.0 и адаптировали тесты к PHP 8.1 (PR).
⚡️ #yiisoftDemo

Демо веб-приложения переехало на Cycle ORM 2, а также заменили аннотации на атрибуты (PR).
#yiisoftSession #ПатчРелиз #Релиз

🎁 Yii Session 1.0.4

• Исправлено: не устанавливалась кука в случаях, когда сессия закрывалась вручную (PR).
⚡️ #yiisoftValidator

Улучшили валидацию вложенных данных в Yii Validator (PR):

• В классе результата валидации Result (объекты этого класса возвращают правила валидации) добавлены новые методы:

- getErrorObjects() — возвращает массив объектов Error, из которых можно получить текст ошибки и атрибут (в виде пути, учитывающего вложенность) к которому он относится;

- getErrorsIndexedByPath() — возвращает массив, где ключи — это атрибуты в виде пути с точкой в качестве разделителя, а значения — массив строк с ошибками, относящимися к этому атрибуту.

Пример:

use Yiisoft\Validator\Rule\Each;
use Yiisoft\Validator\Rule\Nested;

$data = [
'charts' => [
[
'points' => [
['coordinates' => ['x' => -11, 'y' => 11], 'rgb' => [-1, 256, 0]],
['coordinates' => ['x' => -12, 'y' => 12], 'rgb' => [0, -2, 257]]
],
],
[
'points' => [
['coordinates' => ['x' => -1, 'y' => 1], 'rgb' => [0, 0, 0]],
['coordinates' => ['x' => -2, 'y' => 2], 'rgb' => [255, 255, 255]],
],
],
[
'points' => [
['coordinates' => ['x' => -13, 'y' => 13], 'rgb' => [-3, 258, 0]],
['coordinates' => ['x' => -14, 'y' => 14], 'rgb' => [0, -4, 259]],
],
],
],
];

$rule = Nested::rule([
'charts' => Each::rule(new Rules([
Nested::rule([
'points' => Each::rule(new Rules([
Nested::rule([
'coordinates' => Nested::rule([
'x' => [Number::rule()->min(-10)->max(10)],
'y' => [Number::rule()->min(-10)->max(10)],
]),
'rgb' => Each::rule(new Rules([
Number::rule()->min(0)->max(255)->skipOnError(false),
])),
])->skipOnError(false),
])),
])->skipOnError(false),
])),
]);

$errors = $rule->validate($data)->getErrorsIndexedByPath();

В результате переменная $errors будет содержать вот такой массив:

$errors = [
'charts.0.points.0.coordinates.x' => ['Value must be no less than -10.'],
// ...
'charts.0.points.0.rgb.0' => ['Value must be no less than 0. -1 given.'],
// ...
];

• В классе ResultSet() (объект этого класса возвращает валидатор, как результат валидации) также добавлены методы getErrorObjects() и getErrorsIndexedByPath(), они возвращают те же данные, что и в классе Result, но с разбивкой по атрибутам верхнего уровня.

Скорей всего, в дальнейшем ResultSet и Result будут объединены в один класс и как правила валидации, так и валидатор в качестве результата валидации будут возвращать объекты одного класса.
👍7
⚡️ #yiisoftValidator

В правиле валидации MatchRegularExpression из пакета Yii Validator добавлена проверка на тип проверяемого значения, оно должно быть строкой (PR).
⚡️ #yiisoftValidator

В пакете Yii Validator класс Rules переименован в RuleSet (PR).
⚡️ #yiisoftValidator

В пакете Yii Validator удалили класс ResultSet, теперь валидатор и правила валидации возвращают экземпляр класса Result (PR).
⚡️ #yiisoftYiiSwagger

В пакете Yii Swagger в сервисе \Yiisoft\Swagger\Service\SwaggerService добавлен метод withOptions(), позволяющий задать конфигурацию объекта \OpenApi\Annotations\OpenAPI создаваемого этим сервисом (PR, PR).
#yiisoftYiiSwagger #МинорныйРелиз #Релиз

🎁 Yii Swagger 1.2.0

• В сервисе \Yiisoft\Swagger\Service\SwaggerService добавлен метод withOptions(), позволяющий задать конфигурацию объекта \OpenApi\Annotations\OpenAPI создаваемого этим сервисом. Конфигурация объекта OpenAPI также доступна через параметры пакета в config/params.php:

'yiisoft/yii-swagger' => [
// Default values are specified.
'open-api-options' => [
'aliases' => OpenApi\Generator::DEFAULT_ALIASES,
'namespaces' => OpenApi\Generator::DEFAULT_NAMESPACES,
'analyser' => null,
'analysis' => null,
'processors' => null,
'logger' => null,
'validate' => true,
'version' => OpenApi\Annotations\OpenApi::DEFAULT_VERSION,
],
],
//...