Skip to content

Latest commit

 

History

History
154 lines (122 loc) · 5.77 KB

README.md

File metadata and controls

154 lines (122 loc) · 5.77 KB

Автоматический парсинг JSON параметров переданных клиентом

Если необходимо автоматически распарсить JSON переданный от клиента, то самый простой способ это воспользоваться yii\web\JsonParser

В случае, когда необходимо определить парсер только для некоторых контроллеров/экшенов, можно переопределить метод beforeAction следующим образом:

public function beforeAction($action)
{
    \Yii::$app->request->parsers = [
        'application/json' => 'yii\web\JsonParser',
    ];
    return parent::beforeAction($action);
}

Перевод plural сообщения

messages.php

'{n, plural, one{bedroom} few{bedrooms} other{bedrooms}}' => '{n, plural, one{спальня} few{спальни} other{спален}}',

view.php

<?= Yii::$app->i18n->translate(
    'messages',
    '{n, plural, one{bedroom} few{bedrooms} other{bedrooms}}',
    ['n' => $model->bedrooms_count],
    Yii::$app->language
) ?>

Отказ от fxp/composer-asset-plugin в пользу hiqdev/asset-packagist

С версии 2.0.13 шаблоны приложений Yii2 используют hiqdev/asset-packagist вместо fxp/composer-asset-plugin, используйте инструкцию ниже, чтобы мигрировать.

Удалите fxp/composer-asset-plugin из системы

composer global remove fxp/composer-asset-plugin

Удалите из секции config файла composer.json:

"fxp-asset":{
    "installer-paths": {
        "npm-asset-library": "vendor/npm",
        "bower-asset-library": "vendor/bower"
    }
}

Добавьте в ваш composer.json:

"repositories": [
    {
        "type": "composer",
        "url": "https://asset-packagist.org"
    }
]

В итоге ваш composer.json должен иметь примерно следующий вид:

{
    "minimum-stability": "stable",
    "require": {
        "dependencies"
    },
    "require-dev": {
        "dev dependencies"
    },
    "config": {
        "process-timeout": 1800
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://asset-packagist.org"
        }
    ]
}

Задайте алиасы в конфигурации вашего приложения(common/config/main.php для advanced шаблона config/web.php для basic):

$config = [
    ...
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    ...
];

Последним шагом вы можете просто удалить ./vendor и выполнить composer update, либо переместите ./vendor/bower в ./vendor/bower-asset, ./vendor/npm в ./vendor/npm-asset,

Как создать миграции на существующую структуру

Есть несколько расширений, советую Insolita/yii2-migrik т.к. сам его проверял.

Так же есть bizley/yii2-migration, но данным расширением не пользовался.

Как сделать фикстуры из существующих в БД данных

Есть несколько расширений, советую Insolita/yii2-fixturegii т.к. сам его проверял.

Так же есть ElisDN/yii2-gii-fixture-generator, но данным расширением не пользовался.

Как повесить глобальный AccessControl для приложения

Для глобального запрета доступа к приложению зачастую применяется антипаттерн GodObject в виде создания базового контроллера и наследования от него. В Yii2 правильным решением данной задачи будет подключение AccessControl фильтра в конфигурации приложения:

<?php
// other code

return [
    // other code
    
    'as access' => [
        'class' => yii\filters\AccessControl::class,
        'except' => ['site/login', 'site/error'],
        'rules' => [
            [
                'allow' => true,
                'roles' => ['admin'],
            ],
        ],
    ],
    
    // other code
];

Данный пример разрешает пользователям с ролью admin доступ ко всем маршрутам приложения. Маршруты 'site/error' и site/login доступны всем пользователям. Настройка ничем не отличается от настроки AccessControl в behaviors() контроллера.

Как сделать login screen

Чтобы сделать так называемый login screen, необходимо подменить layout, самый простой и элегантный способ это сделать, повесить обработчик на событие beforeAction:

'on beforeAction' => function (\yii\base\Event $e) {
    /** @var \yii\web\Application $app */
    $app = $e->sender;
    // Set login layout for guest users
    if ($app->getUser()->getIsGuest()) {
        $app->layout = 'login';
    }
},