Разное

Rules yii2: Полное руководство (v2): Встроенные валидаторы

Содержание

Yii2. Как валидировать массив с данными?

В процессе разработки часто в качестве атрибута может выступать массив с данными, которые также нужно валидировать. В Yii2 есть необходимый валидатор, о котором мы часто забываем. В этой статье — пример работы с валидатором each для валидации элементов массива.

Собственно все достаточно просто. И отлично описано в документации.

Другими словами — при помощи EachValidator мы можем применить любой валидатор (включая самописные) к каждому из элементов массива.

Ниже пример:

class SomeModel extends yii\base\Model{
// Каждый элемент должен быть числом. Валидация будет успешна.
public $arrayOfInt = [1, 2, 3, 4] ;

// Каждый элемент должен быть в списке [‘yes’, ‘no’]. Валидация будет успешна.
public $arrayOfYesNo = [‘yes’, ‘no’] ;

// Каждый элемент должен быть в списке [‘yes’, ‘no’]. Валидация вернет ошибку. Элемент ‘some-error-value’ не попадает в список разрешенных.
public $array2OfYesNo = [‘yes’, ‘no’, ‘some-error-value’] ;


public function rules(){
return [
[[‘arrayOfInt’], ‘each’, ‘rule’ => [‘integer’]],
[[‘arrayOfYesNo’], ‘each’, ‘rule’ => [‘in’, ‘range’ => [‘yes’, ‘no’]]],
[[‘array2OfYesNo’], ‘each’, ‘rule’ => [‘in’, ‘range’ => [‘yes’, ‘no’]]]
];
}

}


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

class SomeModel extends yii\base\Model{

    // Каждый элемент должен быть числом. Валидация будет успешна.

    public $arrayOfInt = [1, 2, 3, 4] ;

 

    // Каждый элемент должен быть в списке [‘yes’, ‘no’]. Валидация будет успешна.

    public $arrayOfYesNo = [‘yes’, ‘no’] ;

 

    // Каждый элемент должен быть в списке [‘yes’, ‘no’]. Валидация вернет ошибку. Элемент ‘some-error-value’ не попадает в список разрешенных.

    public $array2OfYesNo = [‘yes’, ‘no’, ‘some-error-value’] ;

 

 

    public function rules(){

        return [

            [[‘arrayOfInt’], ‘each’, ‘rule’ => [‘integer’]],

            [[‘arrayOfYesNo’], ‘each’, ‘rule’ => [‘in’, ‘range’ => [‘yes’, ‘no’]]],

            [[‘array2OfYesNo’], ‘each’, ‘rule’ => [‘in’, ‘range’ => [‘yes’, ‘no’]]]

        ];

    }

 

}

Вот и весь пример. Надеюсь мне удалось сделать его максимально понятным и продемонстировать работу валидатора Each.

Если остались вопросы — буду рад Вашим комментариям. Удачи!

Похожие записи

Роутинг в Yii 2.x — UrlManager (Часть 1)

В статье попытаемся разобраться с процессом формирования ссылок. Прежде чем мы рассмотрим этот процесс, включим ЧПУ ссылки.  Про ЧПУ ссылки можно почитать здесь.

        'urlManager' => [
            'enablePrettyUrl' => true, //  запрещаем index.php
            'showScriptName' => false, //// запрещаем r= routes
            'rules' => [ // здесь описываем правила формирования ссылок
            ],
        ],

Общее правило формирования ссылок в yii фреймворке выглядит следующим образом:

'<контроллер:регулярное_выражение>/<действие:регулярное_выражение>' => '<Контроллер>/<Действие>'

Левая часть правила может видоизменяться. Устанавливаем базовый проект, инструкция по установке здесь. Базовый проект содержит контроллер site и несколько действий about, contact, index, login. Видим что наш проект имеет ссылки следующего вида: http://site.ru/site/index (главная), http://site.ru/site/about (о нас), http://site.ru/site/contact (контакты), http://site.ru/site/login(вход). А ссылки должны иметь следующий красивый вид: http://site.ru (главная), http://site.ru/about (о нас), http://site.ru/contact (контакты), http://site.ru/login(вход), для этого в проекте опишем следующие правила: 

    
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            '/' => 'site/index',
                'about' => 'site/about',
                'contact' => 'site/contact',
                'login' => 'site/login',
            ],

Преобразуем последние 3 правила в более короткую запись

    
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            '/' => 'site/index',
            '<action:\w+>' => 'site/<action>',
            ],

На сайте есть личный кабинет администратора, его он использует для наполнения сайта. Пропишем основные правила для личного кабинета:

    
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            '/' => 'site/index',
            '<action:\w+>' => 'site/<action>',

            '<module:cabinet>/<controller:\w+>/<id:\d+>' => '<module>/<controller>/view',
            '<module:cabinet>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>',
            '<module:cabinet>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
            ],

Создадим контроллер News, он будет отвечать за вывод новостей на сайте. Выведем на сайте ленту новостей и сделаем постраничную разбивку и добавим правило:

    
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            '/' => 'site/index',
            '<action:\w+ >' => 'site/<action>',

            'news/page/<page:\d+>'=>'news/index',

            '<module:cabinet>/<controller:\w+>/<id:\d+>' => '<module>/<controller>/view',
            '<module:cabinet>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>',
            '<module:cabinet>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
            ],

Ссылка news/page/?page=1 использующая параметр page, будет преобразована в news/page/1.

Добавим суффикс к ссылке .html

    
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'suffix' => '.html',
            'rules' => [
            '/' => 'site/index',
            '<action:\w+ >' => 'site/<action>',

            'news/page/<page:\d+>'=>'news/index',

            '<module:cabinet>/<controller:\w+>/<id:\d+>' => '<module>/<controller>/view',
            '<module:cabinet>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>',
            '<module:cabinet>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
            ],

Получаем ссылки следующего вида http://site.ru/about.html, http://site.ru/contact.html , http://site. ru/login.html

Далее изменим cуффикс у ссылки http://site.ru/contact.html на .htm, у оставшихся ссылок оставим суффикс .html

    
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'suffix' => '.html',
            'rules' => [
            '/' => 'site/index',
            '<action:\w+ >' => 'site/<action>',
             [
               'pattern'=>'contact',
               'route' => 'site/contact',
               'suffix' => '.htm',
              ],
            'news/page/<page:\d+>'=>'news/index',

            '<module:cabinet>/<controller:\w+>/<id:\d+>' => '<module>/<controller>/view',
            '<module:cabinet>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>',
            '<module:cabinet>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
            ],

При реализации RESTful API, зачастую бывает необходимость в том, чтобы один и тот же URL был разобран в разные маршруты, в зависимости от HTTP метода запроса.

 
[
    'PUT,POST post/<id:\d+>' => 'post/create',
    'DELETE post/<id:\d+>' => 'post/delete',
    'post/<id:\d+>' => 'post/view',
]

Процесс формирования ссылки неотъемлемо связан с регулярными выражениями. Синтаксис регулярных выражений можно посмотреть здесь

Friendly URL (ЧПУ) и роутинг

Сейчас внешний вид ссылок улучшился, но мы видим название контроллера в ссылке — site:

Для этого в массив urlManager добавим еще один, под названием rules. В rules мы будем описывать правила отображения ссылок. И начнем с главной страницы и страницы about

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        '/' => 'site/index',
        'about' => 'site/about',
    ],
],

Ссылки этих двух страниц стали выглядеть красивее, но если мы сейчас перейдем на страницу about и введем url как раньше http://frontend. test/site/about тогда мы увидим, что страница about все еще открывается.

С точки зрения продвижение сайта — это не очень хорошо, так как у нас одна и та же страница доступна по двум разным ссылкам. Давайте сделаем так, чтобы наши страницы открывались только исходя из наших правил. Сделать это очень просто.

Для включения такой возможности, нам нужно прописать в urlManager такую запись:

'enableStrictParsing' => true,

и если сейчас мы откроем страницу http://frontend.test/site/about вы увидите ошибку 404, которая обозначает, что данная страница не найдена, но если мы перейдем по ссылки из наших правил, страница about откроется.

 

Если по какой либо причине вы хотите, чтобы ваша страница открывалась с двух разных url, вы можете прописать и такие правила. Давайте рассмотрим такую возможность на созданной странице в прошлом уроке Yii2.

 

Создадим правила для этой страницы:

'hello' => 'site/hello',

И теперь, если мы хотим, чтобы страница открывалась не по ссылке hello, а например по ссылке hi, мы можем внести такую правку:

'hi' => 'site/hello',

Также мы можем написать правило, чтобы страница открывалась по двум ссылкам:

'hi|hello' => 'site/hello',

 

В блоке rules можно задавать и более сложные правила и к этим правилам мы еще вернемся в последующих уроках.  

 

В качестве домашнего задания попробуйте самостоятельно дописать остальные правила для страниц контроллера SiteController и если вдруг не получится.

 

Посмотрите как могут выглядеть эти правила:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'enableStrictParsing' => true, // Следовать только правилам ниже
    'rules' => [
        '/' => 'site/index',
        'hi|hello' => 'site/hello',
        'about' => 'site/about',
        'contact' => 'site/contact',
        'login' => 'site/login',
        'logout' => 'site/logout',
        'captcha' => 'site/captcha',
        'signup' => 'site/signup',
        'request-password-reset' => 'site/request-password-reset',
        'reset-password' => 'site/reset-password',
    ],
],

Если у вас возникают вопросы, задать вы их можете в комьюнити FructCode, где другие участники сообщества, помогут решить ту или иную проблему.

Научиться программировать с помощью фреймворка Yii2 вы можете на сайте FructCode.

Подпишитесь на канал FructCode в YouTube, чтобы не пропускать новые видео!

С вами был Сергей Никонов и увидимся в следующих уроках Yii2.

Web-разработка • Yii2 и Laravel


После заполнения полей формы на сайте, необходимо проверить правильность введенных данных. Правила валидации полей формы описываются в методе rules() модели формы. Данный метод должен возвращать массив, в котором к свойствам модели (полям формы) применены те или иные валидаторы.

<?php
namespace app\models;
use yii\base\Model;

class FeedbackForm extends Model
{
    public $name, $email, $body;

    public function attributeLabels() {
        return [
            'name' => 'Ваше имя',
            'email' => 'Ваш email',
            'body' => 'Ваше сообщение',
        ];
    }

    public function rules() {
        return [
            ['name', 'required'], // поле name обязательно для заполнения
            ['email', 'required'] // поле email обязательно для заполнения
        ];
    }
}
/* . .. */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required']
        ];
    }
}



Yii2 добавит на страницу с формой js-код для проверки полей формы:

<script>
jQuery(function ($) {
    jQuery('#feedback-form').yiiActiveForm(
        [
            {
                "id":"feedbackform-name",
                "name":"name",
                "container":".field-feedbackform-name",
                "input":"#feedbackform-name",
                "validate":function (attribute, value, messages, deferred, $form) {
                    yii.validation.required(
                        value,
                        messages,
                        {"message":"Необходимо заполнить «Ваше имя»."}
                    );
                }
            },
            {
                "id":"feedbackform-email",
                "name":"email",
                "container":". field-feedbackform-email",
                "input":"#feedbackform-email",
                "validate":function (attribute, value, messages, deferred, $form) {
                    yii.validation.required(
                        value,
                        messages,
                        {"message":"Необходимо заполнить «Ваш email»."}
                    );
                }
            }
        ],
        []
    );
});
</script>


Чтобы сообщения об ошибках были на русском языке, необходимо добавить в файл конфигурации:

<?php
/*
 * Файл config/web.php
 */
$config = [
    /* ... */
    'language' => 'ru-RU',
    /* ... */
];


Если сообщения об ошибках по умолчанию не устраивают, можно задать свой текст сообщения:

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения']
        ];
    }
}



Добавим еще одно правило для проверки корректности адреса электронной почты:

/* . .. */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
        ];
    }
}




Добавим проверку длины поля name:

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // поле name должно быть длиной не менее 2 символов
            ['name', 'string', 'min' => 2],
            // поле name должно быть длиной не более 10 символов
            ['name', 'string', 'max' => 10],
        ];
    }
}
/* . .. */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // поле name должно быть длиной не менее 2 символов
            ['name', 'string', 'min' => 2, 'tooShort' => 'Поле должно быть длиной не менее 2 символов'],
            // поле name должно быть длиной не более 10 символов
            ['name', 'string', 'max' => 10, 'tooLong' => 'Поле должно быть длиной не более 10 символов'],
        ];
    }
}


Еще один вариант указать минимальную и максимальную длину поля:

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // поле name должно быть длиной от 2 до 10 символов
            ['name', 'string', 'length' => [2, 10]]
        ];
    }
}


Удалить лишние пробелы и установить значение по умолчанию для поля city:

/* . .. */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // удалить пробелы для полей name, email и city
            [['name', 'email', 'city'], 'trim'],
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // если поле city пустое, устанавливаем значение Москва
            ['city', 'default', 'value' => 'Москва'],
        ];
    }
}


Можно добавить свой валидатор, но он будет работать только на сервере:

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // удалить пробелы для полей name, email и city
            [['name', 'email', 'city'], 'trim'],
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // если поле city пустое, устанавливаем значение Москва
            ['city', 'default', 'value' => 'Москва'],
            // проверка названия города, будет работать только на сервере
            [
                'city',
                function ($attribute, $params) {
                    if (!in_array($this->$attribute, ['Москва', 'Минск', 'Астана'])) {
                        $this->addError($attribute, 'Город должен быть Москва, Минск или Астана');
                    }
                },
                'skipOnEmpty' => false
            ],
        ];
    }
}
/* . .. */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // удалить пробелы для полей name, email и city
            [['name', 'email', 'city'], 'trim'],
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // если поле city пустое, устанавливаем значение Москва
            ['city', 'default', 'value' => 'Москва'],
            // проверка названия города, будет работать только на сервере
            ['city', 'validateCity', 'skipOnEmpty' => false],
        ];
    }

    public function validateCity($attribute, $params) {
        if (!in_array($this->$attribute, ['Москва', 'Минск', 'Астана'])) {
            $this->addError($attribute, 'Город должен быть Москва, Минск или Астана');
        }
    }
}
Дополнительно

Поиск:
PHP • Web-разработка • Форма • Фреймворк • Form • Validate • Валидация • Rule • Yii2

Проверка значения на уникальность Yii2 Developer.

uz

Вот уже почти год, как я работаю на Laravel (требование заказчика), но всем сердцем продолжаю любить Yii. С недавнего времени начала в свободное время контрибутить в сам фреимворк с мелкими баг-фиксами и улучшениями. И сегодня хочу рассказать про UniqueValidator, который проверяет уникальность значения. Документация на него немного запутанная, поэтому уверена что дополнительные разъяснения кому-нибудь да пригодятся.

Базовая запись валидатора выглядит так:


public function rules()
{
  return [
     ['login', 'unique'],
     ...
  ]
}

И тут все ясно — поле login должно быть уникальным (т.е в текущей таблице не должно быть уже такой записи). Если проверять нужно уникальность поля в другой таблице то можно задать в targetClass правильную модель, что тоже в принципе понятно. Аттрибут filter полезен если нужны какие-то дополнительные проверки, например что логин не должен совпадать с логином активного пользователя:


public function rules()
{
  return [
     ['login', 'unique', 'filter' => 'is_active = true'],
     . ..
  ]
}

Фильтр может быть выражением (в запросе оно пойдет как AND) или анонимной функцией, в которой можно модефицировать $query

Как правильно указывать targetAttribute

При более сложных проверках наибольшие проблемы вызывает targetAttribute. Потому что:


     ['login', 'unique', 'targetAttribute' => 'name'],

проверит что текущее значение login у валидируемой модели не существует в таблице в поле name. А запись


     ['login', 'unique', 'targetAttribute' => ['name']],

проверит что текущее значение name у валидируемой модели не существует в таблице в поле name. Во втором случаи значение login в проверке учавствовать не будет совсем! Оно только получит сообщение об ошибке.

Баг или фича?

Фича 🙂 К примеру вам нужно проверить что у вас уникальная пара login AND name.


     ['login', 'unique', 'targetAttribute' => ['login', 'name']],

Каждый из targetAttribute будет сверяться со своим полем в модели, т.е login с login a name с name.
Если же нужно проверить значение login и для поля name то выглядить это будет так:


     ['login', 'unique', 'targetAttribute' => ['login', 'login' => 'name']],

НО тут важно понимать, что запись будет НЕ уникальной только тогда когда значение login будет в базе в поле login И name. Т.е если логин такой уже существует, а name у этой записи не совпадает с логином — то запись уникальна.
Если вам нужно проверить, что login не совпадает с существующим login ИЛИ существующем name то запись должна быть такой:


     ['login', 'unique'],
     ['login', 'unique', 'targetAttribute' => 'name'],

Запомните: все аттрибуты переданные в targetAttribute в виде массива в запросе к базе соединяются через AND.

Если остались вопросы — пишите в комментах. Так же можно задавать вопросы по любым другим валидаторам.
Напомню список все существующих стандартных валидаторов Yii2: boolean, captcha, compare, date, datetime, time, default, double, each, email, exist, file, filter, image, in, integer, match, number, required, safe, string, trim, unique, url и ip.

Yii2: Правила валидации форм | Liblessons

Список основных правил для валидации данных форм в Yii2

Проверки типа вводимых данных

1
2
3
4
5
6
7
8
9
10
public function rules()
{
	return [
		[ ['var1'], 'boolean'],
		[ ['var2'], 'number'],
		[ ['var3'], 'integer'],
		[ ['var4'], 'double'],
		[ ['var5'], 'string'],
	];
}

public function rules()
{
return [
[ [‘var1’], ‘boolean’],
[ [‘var2’], ‘number’],
[ [‘var3’], ‘integer’],
[ [‘var4’], ‘double’],
[ [‘var5’], ‘string’],
];
}

Обязательное для заполнения поле

1
2
3
4
5
6
public function rules()
{
	return [
		[ ['var'], 'required'],
	];
}

public function rules()
{
return [
[ [‘var’], ‘required’],
];
}

Валидация e-mail

1
2
3
4
5
6
public function rules()
{
	return [
		[['var'], 'email'],
	];
}

public function rules()
{
return [
[[‘var’], ’email’],
];
}

Значение по умолчанию

1
2
3
4
5
6
public function rules()
{
	return [
		[ ['var'], 'default', 'value' => 'значение по умолчанию'],
	];
}

public function rules()
{
return [
[ [‘var’], ‘default’, ‘value’ => ‘значение по умолчанию’],
];
}

Минимальное и максимальное значение для числа

1
2
3
4
5
6
7
8
public function rules()
{
	return [
		[ ['var1'], 'number', 'min' => 5],
		[ ['var2'], 'number', 'max' => 10],
		[ ['var3'], 'number', 'min' => 3, 'max' => 7],
	];
}

public function rules()
{
return [
[ [‘var1’], ‘number’, ‘min’ => 5],
[ [‘var2’], ‘number’, ‘max’ => 10],
[ [‘var3’], ‘number’, ‘min’ => 3, ‘max’ => 7],
];
}

Минимальное и максимальное значение для строки

1
2
3
4
5
6
7
8
public function rules()
{
	return [
		[ ['var1'], 'string', 'min' => 5],
		[ ['var2'], 'string', 'max' => 10],
		[ ['var3'], 'string', 'min' => 3, 'max' => 7],
	];
}

public function rules()
{
return [
[ [‘var1’], ‘string’, ‘min’ => 5],
[ [‘var2’], ‘string’, ‘max’ => 10],
[ [‘var3’], ‘string’, ‘min’ => 3, ‘max’ => 7],
];
}

Обрезаем пробелы в начале и в конце

1
2
3
4
5
6
public function rules()
{
	return [
		[['var1', 'var2'], 'trim'],
	];
}

public function rules()
{
return [
[[‘var1’, ‘var2’], ‘trim’],
];
}

Проверка правильно ли введены пароль и его подтверждение

1
2
3
4
5
6
public function rules()
{
	return [
		['password', 'compare', 'compareAttribute' => 'password_repeat'],
	];
}

public function rules()
{
return [
[‘password’, ‘compare’, ‘compareAttribute’ => ‘password_repeat’],
];
}

Yii2 Access Control.

Авторизация в Yii2

От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы с вами познакомимся с фильтром контроля доступа – Yii2 Access Control Filter (ACF). Благодаря ACF мы можем реализовать простой контроль доступа к приложению и закрыть, к примеру, администраторскую часть сайта для гостей.

В одной из предыдущих статей мы с вами реализовали модуль админки, который доступен по адресу //yii2/admin. Если сейчас обратиться к нашей админке – мы без проблем в нее попадем, несмотря на то, что мы не авторизованы для этого.

Наша задача – ограничить доступ к этой части приложения и предоставлять его только авторизованным пользователям. Простейшим вариантом здесь будет использование фильтра контроля доступа.

Поскольку в админке может быть множество контроллеров и ко всем им нужно применить одно и то же действие, — это наталкивает нас на мысль прописать нужный код единожды в некоем общем файле, чтобы не дублировать его для каждого контроллера. Таким файлом может быть класс app\modules\admin\Module. Пропишем в нем минимальный код, который можно взять из документации по ACF.

Фреймворк Yii2. Быстрый старт

Получите курс и узнайте, как с помощью фреймворка Yii2 разрабатывать веб-приложения на примере блога

Смотреть курс

public function behaviors(){
return [
‘access’ => [
‘class’ => \yii\filters\AccessControl::className(),
‘rules’ => [
[
‘allow’ => true,
‘roles’ => [‘@’],
],
],
],
];
}

public function behaviors(){

    return [

        ‘access’ => [

            ‘class’ => \yii\filters\AccessControl::className(),

            ‘rules’ => [

                [

                    ‘allow’ => true,

                    ‘roles’ => [‘@’],

                ],

            ],

        ],

    ];

}

Что делает данный код? Собственно, он определяет правило, согласно которому доступ к модулю (‘allow’ => true) имеют только авторизованные пользователи (‘roles’ => [‘@’]). Знак @ — это специальный символ, обозначающий авторизованного пользователя. Другой специальный символ — ? – вы можете помнить по статье, в которой мы устанавливали файловый менеджер. Символ ? обозначает гостя.

Теперь попробуем повторно обратиться к админке:

Поскольку мы не авторизованы, фреймворк запрещает доступ к модулю и производит редирект на страницу авторизации. Попробуем авторизоваться с данными для тестового доступа (логин – admin, пароль — admin). После корректного их ввода мы авторизуемся и успешно попадаем в админку.

Собственно, все – мы реализовали простейшее ограничение доступа, используя фильтр контроля доступа Access Control Filter.

Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.

Фреймворк Yii2. Быстрый старт

Получите курс и узнайте, как с помощью фреймворка Yii2 разрабатывать веб-приложения на примере блога

Смотреть курс

Фреймворк YII2.

Быстрый старт

Создание блога с использованием фреймворка Yii2!

Смотреть видео

yii — Как применить правила обновления в yii2

Вы можете добавить правила проверки в модель yii, например,

  правила публичной функции () {
        возвращаться [
        [['boolean_var'], 'boolean'],
            [['range_in_string'], 'обязательно'],
            [['default_value'], 'default', 'value' => 'DEFAULT VALUE'],
            [['integer_var'], 'integer'],
            [['double_var'], 'double'],
            [['number_min'], 'number', 'min' => 10],
            [['number_max'], 'number', 'max' => 100],
            [['number_min_max'], 'number', 'min' => 10, 'max' => 100],
            [['file_image'], 'image'],
            [['file_var'], 'file', 'types' => ['gif', 'jpg']],
            [['date_var'], 'date', 'format' => 'd-m-yy'],

            [['min_string'], 'строка', 'min' => 10],
            [['max_string'], 'строка', 'max' => 10],
            [['min_max_string'], 'строка', 'min' => 5, 'max' => 10],
            ['min_max_string2', 'строка', 'длина' => [4, 10]],

            ['email_var', 'email'],
            ['url_var', 'url'],

            [['unique_var'], 'unique'],

            [['filter_trim'], 'filter', 'filter' => 'trim'],
            [['filter_trim'], 'filter', 'filter' => 'strtolower'],
            ['filter_custom_function', 'filter', 'filter' => function ($ value) {
            // ваша концепция
            если ($ значение == '')
            возвращаться '';
            return 'Value Changed';}],

            ['range_in_min_max', 'in', 'range' => диапазон (5,20)],

            ['range_in', 'in', 'range' => ['en', 'fr', 'zn'], 'strict' => false], // строгое ложь
            ['range_in_string', 'in', 'range' => ['EN', 'FR', 'ZN'], 'strict' => true],

            ['custom_validation', 'custom_function_validation'],

            [['passwordConfirm'], 'compare', 'compareAttribute' => 'пароль'],
            [['пароль', 'date_var'], 'safe'],
        ];
}
  

, если вам нужно запускать только при обновлении, но не при создании, вы можете добавить сценарий, подобный этому

  правил публичной функции ()
{
    возвращаться [
        // имя пользователя, адрес электронной почты и пароль требуются в сценарии "обновления"
        [['имя пользователя', 'электронная почта', 'пароль'], 'обязательно', 'on' => 'обновить'],

        // имя пользователя и пароль требуются в сценарии "входа в систему"
        [['имя пользователя', 'пароль'], 'обязательно', 'on' => 'логин'],
    ];
}
  

и в вашем действии перед вызовом проверки добавьте сценарий

// сценарий задан как свойство

  $ модель = новый пользователь;
$ модель-> сценарий = 'обновить';
  

Расширение Craft CMS с помощью правил проверки и поведения

правил / UserRules. php

   [self :: USERNAME_MIN_LENGTH, self :: USERNAME_MAX_LENGTH],
                'tooLong' => Craft :: t (
                    'сайт-модуль',
                    'Ваше имя пользователя {макс. } Символов или короче.',
                    [
                        'min' => self :: USERNAME_MIN_LENGTH,
                        'max' => self :: USERNAME_MAX_LENGTH
                    ]
                ),
                'tooShort' => Craft :: t (
                    'сайт-модуль',
                    'Ваше имя пользователя должно содержать не менее {мин} символов.',
                    [
                        'min' => self :: USERNAME_MIN_LENGTH,
                        'max' => self :: USERNAME_MAX_LENGTH
                    ]
                ),
            ],
            [
                'пароль',
                'нить',
                'min' => self :: PASSWORD_MIN_LENGTH,
                'tooShort' => Craft :: t (
                    'сайт-модуль',
                    'Ваш пароль должен содержать не менее {min} символов.',
                    ['min' => self :: PASSWORD_MIN_LENGTH]
                )
            ],
            [
                'пароль',
                'матч',
                'шаблон' => '/ ^ (? =. & \ *]) (? =. {7,}) / ',
                'message' => Craft :: t (
                    'сайт-модуль',
                    «Ваш пароль должен содержать по крайней мере одно из следующего: число, символ нижнего регистра, символ верхнего регистра и специальный символ»
                )
            ],
        ];
    }
}
  

rules / UserRules.php

【Yii2】 模型 Model 中 使用 rules 规则 定义 场景 setScenario 限制 规则 _ 雨果 虾 的 Blog-CSDN 博客

在 我们 的 日常 需求 中 , 会有 这种

数据 表 中 存在 图片 字段 , 为 必填 , 需要 在 操作 过程 中 做到

  • 创建 数据 时 , 图片 字段 必须
  • 修改 数据 时 , 图片 字段 如果 不 传 就不 修改

业务 数据 操作

如果 要 保持 原来 的 图片 数据 , 那 只要 修改 的 时候 带着 原来 的 参数 即可

  1. 的 数据
  2. 图片 数据 放在 隐藏 的 文本 域中
  3. 表单 时 如果 图片 上传 的 字段 没有 本 的 图片 数据 文本 中 拿出

的 操作 当然 能 满足 需求 , 但是 太 复杂 了

定义 场景 setScenario

在 Yii 的 数据 操作 中 , 一般 的 逻辑 如下

  1. 判断 是否 有 提交 数据 Yii :: $ app-> request-> post ()
  2. 表单 数据 加载 到 模型 model 中 $ model-> load (Yii :: $ app-> request-> post ( ))
  3. model 的 数据 $ model-> save ()

重点 时 第三 步 , 在 save 的 操作 中 , 执行 操作 , 判断 如何 model 中

 
    общедоступная функция сохранения ($ runValidation = true, $ attributeNames = null)
    {
        if ($ this-> getIsNewRecord ()) {
            return $ this-> insert ($ runValidation, $ attributeNames);
        }

        return $ this-> update ($ runValidation, $ attributeNames)! == false;
    }
  

$ runValidation = true 会 验证 规则, 如下

  правил публичной функции ()
    {
        возвращаться [
            [['имя', 'сортировка'], 'обязательно'],
            [['classify', 'is_recommend', 'sort', 'status', 'create_at', 'update_at'], 'integer'],
            [['имя'], 'строка', 'макс' => 64],
            [['изображения'], 'строка', 'макс' => 255],
        ];
    }
  

这里 清楚 的 标记 了 哪些 字段 是 有 必须 的 , 哪些 字段 的 长度 最大 是 多少

我们 先看 源码 model 中 的 rules 的 部分

 
    правила публичной функции ()
    {
        возвращаться [];
    }
  

其中 关于 场景 的 部分, on 定义 场景

  'on' => ['сценарий1', 'сценарий2'],
  

可以 应用 规则。 如果 未 设置 此 选项 , 则 该 规则 将 适用 于 所有 场景。

 Может применяться правило . Если этот параметр не установлен, правило будет применяться ко всем сценариям.
  

当 规则 对应 的 场景 时 , 规则 会 被 采用

  ['пароль', 'сравнить', 'compareAttribute' => 'пароль2', 'on' => 'зарегистрировать'],
   ['пароль', 'аутентификация', 'on' => 'логин'],
  

那么 , 最后 我们 得到 关于 图片 的 字段 约束 规则 如下

  [['images'], 'required', 'on' => ['create'], 'enableClientValidation' => false],
            [['images'], 'defaultHead', 'skipOnEmpty' => false, 'on' => ['edit']],
  

Компоненты или модули конфигурации Yii2

  1. PCEUROPA
  2. Блог
  3. Yii2
  4. Пост

Боковая панель

Автор : Рафаль Маргузевич
Опубликован :
Категории : Yii2
Теги : конфигурация • framework


Файл конфигурации Базовый шаблон Yii2 находится на пути config / web. php . В случае конфигурации Расширенный шаблон Yii2 , внешний интерфейс и серверная часть имеют свои собственные файлы конфигурации: frontend / config / main.php и backend / config / main.php
Дополнительно получите конфигурацию из общего файла common /config/main.php

По какой-то причине я рекомендую выбирать Yii2 на базовом шаблоне. Просто настройка проще.

Каждый из этих файлов получает дополнительные настройки из других файлов.Часто это файл с данными доступа к базе данных app / config / db.php , с параметрами app / config / params.php , которые будут доступны во всем приложении (например, адрес электронной почты администратора).

Концепция конфигурации в Yii2

Файл конфигурации представляет собой ассоциативный массив, из которых:

  1. Ключи — это свойства класса yii \ web \ Application
  2. Синтаксис основан на правилах конфигурации Yii2

Я аппроксимирую эту концепцию на примере компонента, который увеличивает возможности framework Yii2 отправки электронных писем.

  'компоненты' => [
    ...
    'mailer' => [
        'class' => 'yii \ swiftmailer \ Mailer',
        'транспорт' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'localhost',
            'username' => 'username',
            'пароль' => 'пароль',
            'порт' => '587',
            'encryption' => 'tls',
        ],
    ],
    ...
],  

Имя компонента совпадает с именем ключа — mailer , и мы можем ссылаться на компонент через код Yii :: $ app-> mailer .В случае, если для настройки необходимых модулей или компонентов установлен класс [‘class’ => class_of_component], в моем примере значение yii \ swiftmailer \ Mailer . Если мы не знаем параметры класса, их можно найти на странице Yii2 API. В контексте конфигурации нам интересен раздел свойств, в котором у нас есть возможные варианты, с типами параметров.

Пример конфигурации в Yii2

Я представлю наиболее часто используемые варианты. Для удобства я вставил объединенный файл конфигурации .

   'pl',
'sourceLanguage' => 'ru',
'homeUrl' => '/',
'charset' => 'UTF-8',
'vendorPath' => dirname (dirname (__ DIR__)). '/продавец',
'basePath' => dirname (__ DIR__),

'modules' => [
'меню' => [
'class' => '\ pceuropa \ menu \ Menu',
],
'formbuilder' => [
'class' => '\ pceuropa \ forms \ Module',
'config' => ['table' => 'form_']
],

],

'компоненты' => [
    'запрос' => [
        'cookieValidationKey' => 'secret_key',
        'csrfParam' => '_csrf-backend',
        'baseUrl' => '/',
    ],

    'db' => [
        'class' => 'yii \ db \ Connection',
        'dsn' => 'mysql: host = localhost; dbname = nazwa_bazy',
        'username' => 'root',
        'пароль' => '',
        'charset' => 'utf8',
    ],

    // 'cache' => ['class' => 'yii \ caching \ FileCache',],
'session' => ['class' => 'yii \ web \ DbSession',
    'name' => 'bronze_cookie',

],

'журнал' => [
    'traceLevel' => YII_DEBUG? 3: 0,
    'target' => [
        [
        'class' => 'yii \ log \ DbTarget',
        'levels' => ['ошибка', 'предупреждение'],
        ],
        [
        'class' => 'yii \ log \ EmailTarget',
'mailer' => 'почтовая программа',
'except' => ['yii \ web \ HttpException: 404',],
        'levels' => ['ошибка'],
        'message' => [
            'from' => ['info @ pceuropa. сеть'],
            'to' => ['[email protected]'],
            'subject' => 'Журнал сообщения от yii2',
            ],
        ],
    ],
],

    'пользователь' => [
        "class" => "yii \ web \ User",
        'identityClass' => 'common \ models \ User',
        'enableAutoLogin' => истина,
        // 'returnUrl' => 'site / contact',
    ],

    'urlManager' => [
        'baseUrl' => '',
        'hostInfo' => 'http: // example.dev ',
        'class' => 'codemix \ localeurls \ UrlManager',
        'languages' => ['pl', 'en'],
        'languageParam' => 'язык',
        'enableDefaultLanguageUrlCode' => ложь,
        'enableLanguagePersistence' => ложь,
        'enableLanguageDetection' => ложь,
        'enablePrettyUrl' => истина,
        'showScriptName' => ложь,
        'rules' => [
            '/' => 'сайт / индекс',
            '<действие: \ w +>' => 'сайт / <действие>',
            '<контроллер: \ w + /?>' => '<контроллер> / индекс',
            '<контроллер: \ w +> / ' => ' / view',
            '<контроллер: \ w +> / <действие: \ w +> / ' => '<контроллер> / <действие>',
        ],
    ],
    'authManager' => ['class' => 'yii \ rbac \ DbManager',],

    'i18n' => [
        'translations' => [
            'приложение' => [
                'class' => 'yii \ i18n \ PhpMessageSource',
                'basePath' => '@ app / messages',
                'fileMap' => ['app' => 'приложение. php ',]
            ]
        ]
    ],

    'mailer' => [
        'class' => 'yii \ swiftmailer \ Mailer',
        'viewPath' => '@ app / mail',
        'useFileTransport' => ложь,
        'транспорт' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'imap.google.com',
            'username' => '[email protected]',
            'пароль' => 'пройти',
            'порт' => '465',
            'encryption' => 'ssl',
        ],
    ],
    'assetManager' => [
        'class' => 'yii \ web \ AssetManager',
        'bundles' => [
            'yii \ web \ JqueryAsset' => ['js' => ['// код.jquery.com/jquery-3.2.1.min.js ']],
            'yii \ bootstrap \ BootstrapAsset' => ['css' => ['//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css']],
            'yii \ bootstrap \ BootstrapPluginAsset' => ['js' => ['//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js']]
        ]
    ],

],

'params' => [
    'adminEmail' => 'admin@example. com',
    'supportEmail' => '[email protected]',
    'Пользователь.passwordResetTokenExpire '=> 3600,
],

'aliases' => [
    '@www' => 'http://pceuropa.dev',
    '@img' => '@ www / images /',
    '@img_path' => '@ app / web / images',
    '@views' => '@ app / views',
]
];  

Описание вариантов конфигурации

  1. язык — текущий язык страницы, язык сообщений приложения. vendor / yiisoft / yii2 / messages и атрибут lang на главной странице. Эта опция влияет на компонент i18n (linia 83)
  2. sourceLanguage — указывает исходный язык страницы.Это необходимо в случае, если приложение имеет более одного языка. Для лучшего сжатия, различающегося между sourceLAnguage и языком, см. Параметр / компонент i18n, который основан на этих параметрах.
  3. модуля — сюда добавляются новые модули. Ключ — это идентификатор модуля. например / формы / контроллер / действие. Модули — хороший способ управлять пространством имен, например. добавить новый модуль администратора. Это полезно в случае использования шаблона Yii2 basic. Здесь мы можем передать данные конфигурации модуля. Имена свойств должны совпадать с общедоступными свойствами модуля класса
  4. .

  5. детали
    • запрос — базовая опция cookieValidationKey — ключ безопасности cookie.В случае нарушения безопасности файлов cookie — смените ключ — старые файлы cookie будут устаревшими и принудительно использовать новые.
      baseUrl — опция полезна, когда приложение находится в подпапке (например, backend — панель администратора)
    • db — доступ к базе данных (SQL, MongoDb, Redis, ElasticSearch и др.)
    • журнал — ведение журнала событий. Я предпочитаю создавать журналы в базе данных и отправлять журналы по электронной почте в случае ошибок (события исключения 404). Сканеры позволяют получать множество уведомлений, а затем упускать из виду самые важные.Благодаря этому компоненту можно решить проблемы, после чего пользователь напишет электронное письмо о том, что что-то не работает.
    • пользователь — логин, регистрация, управление авторизацией пользователей. Значение identityClass — это имя класса, методы которого отвечают за идентификацию пользователей.
    • urlManager — Управление URL. enablePrettyUrl установлен на true — запускает удобный для поисковых систем и людей красивый URL. В правиле правило нужно установить правила для перезаписи адреса e.грамм. /index.php?r=kontroler/view&id=3 переписать на / kontroler / 3 .

      baseUrl i hostInfo используется классом yii \ helpers \ Url для генерации URL. Если наш сайт находится в подпапке, чем , baseUrl (также из запроса модуля) необходимо установить, например ‘/ Admin. hostInfo необходимо для генерации абсолютного URL. В этом примере вы можете видеть, что я использую внешних поставщиков программного обеспечения класса. Это расширенный менеджер URL о возможности префиксов языков (pl, en) и дополнительных опций конфигурации. Теперь структура адреса автоматически меняет форму адреса / controller / 3 на / pl / controller / 3. Если enableDefaultLanguageUrlCode имеет значение false, то / en / controller / 3 будет / controller / 3. showScriptName on false — framework не отображает index.php в URL

    • authManager — авторизация менеджера. Класс yii \ rbac \ DbManager разрешает авторизацию RBAC. Я рекомендую RBAC, потому что, если нам не нужна авторизация на основе правила и роли, а нужна только простая авторизация в журнале / квесте, мы сможем выбрать.
    • i18n — компонент, отвечающий за интернационализацию. Мы можем добавить источник переводов (файлы 0 yii \ i18n \ PhpMessageSource, базы данных yii \ i18n \ DbMessageSource)
    • mailer — выбор класса управления рассылкой почты пал на yii \ swiftmailer \ Mailer . Атомарное решение — установите правильный доступ к данным SMTP, и вы можете спать спокойно.
    • assetManager — вы можете изменить CSS по умолчанию и Js. Например. если вам нужна локальная версия минификации.
       
      'bundles' => [
                  'yii \ web \ JqueryAsset' => ['js' => ['jquery.min.js']],
                  'yii \ bootstrap \ BootstrapAsset' => ['css' => ['css / bootstrap.min.css']],
                  'yii \ bootstrap \ BootstrapPluginAsset' => ['js' => ['js / bootstrap.min.js']]
              ]
        
  6. params — глобальные параметры, доступ во всем приложении. Чтобы получить значение adminEmail , используйте код: Yii :: $ app-> params [‘adminEmail’].Если вам нужно указать путь или URL, лучше использовать псевдонимы
  7. псевдонимов — Yii2 имеет много псевдонимов по умолчанию, путь и URL. Если вам нужно указать адрес местонахождения доциментов, вы можете сделать это здесь. И в приложении использовать A Url :: to ('@ img / photo.png') . В случае повторной факторизации достаточно изменить один псевдоним.

Популярные поисковые запросы:
yii2 Конфигурация компонента должна содержать элемент класса (1) |


Боковая панель >>

Как добавить аутентификацию reCAPTCHA в формы Yii 2

CAPTCHA — это собирательное название нескольких методов и тестов, которые не позволяют спамерам, ботам и автоматизированным службам добавлять ложные или вредоносные данные в базу данных веб-сайта. В этом руководстве вы узнаете, как добавить reCAPTCHA Google в контактную форму. Эта служба предоставляет изображения слов, которые бросают вызов любому программному обеспечению для оптического распознавания символов (OCR).

Перед тем, как начать изучение этого руководства, убедитесь, что вы установили и настроили приложение Yii2 на Cloudways. После этого начните с регистрации ключа API Google reCAPTCHA.

Создание ключа API Google reCAPTCHA

Перейдите на официальный сайт Google reCAPTCHA и нажмите Получить reCAPTCHA.

На странице администратора зарегистрируйте свой сайт. В разделе Domains вы можете использовать промежуточный URL-адрес приложения или любой другой пользовательский домен на сайте.

Когда закончите, нажмите Register . Веб-сайт теперь будет предлагать Site Key и Secret Key. Оба эти ключа будут использоваться в этом руководстве.

Пришло время добавить reCAPTCHA в приложение Yii 2.

Добавление расширения reCAPTCHA для Yii 2

Первый шаг — добавить расширение reCAPTCHA. Для этого войдите в приложение Yii 2, используя SSH-терминал, предоставляемый Cloudways. (Вы также можете использовать PuTTY.)

Выполните следующую команду, чтобы добавить расширение:

 composer require --prefer-dist "himiklab / yii2-recaptcha-widget" "*" 

По мере установки расширения вы увидите следующий экран:

После установки следующим шагом будет правильная настройка расширения.

Перейдите в папку config и откройте web.php , расположенный внутри папки компонентов . Добавьте следующий код в БД :

 'reCaptcha' => [

'name' => 'reCaptcha',

'class' => 'himiklab \ yii2 \ recaptcha \ ReCaptcha',

'siteKey' => 'sitekey',

'secret' => 'секретный ключ',

], 

Там, где это указано, добавьте свой сайт и секретные ключи, предоставленные Google reCAPTCHA, и сохраните файл.

Добавление reCAPTCHA в контактную форму

Теперь вы можете добавить метод аутентификации в контактные формы, которые поставляются с Yii 2 Basic.

Перейдите в представление / сайт и откройте contact.php. В этом файле найдите следующий блок кода:

  field ($ model, 'verifyCode') -> widget (Captcha :: className (), [

'template' => '
{изображение}
{input}
', ])?>

Теперь замените его на этот код:

  field ($ model, 'reCaptcha') -> widget (\ himiklab \ yii2 \ recaptcha \ ReCaptcha :: className ())?> 

Затем добавьте правило в модель контактной формы.Перейдите к моделям и откройте ContactForm.php. В правилах () добавьте новое правило для reCAPTCHA:

 правила публичных функций ()
{
возвращаться [
// имя, адрес электронной почты, тема и текст обязательны
[['имя', 'адрес электронной почты', 'тема', 'текст', 'reCaptcha'], 'обязательно'],
// электронная почта должна быть действующим адресом электронной почты
['электронная почта', 'электронная почта'],
// verifyCode необходимо ввести правильно
['reCaptcha', \ himiklab \ yii2 \ recaptcha \ ReCaptchaValidator :: className (), 'secret' => '6LeTXQgUAAAAALExcpzgCxWdnWjJcPDoMfK3oKGi']

];
} 

Теперь в функции attributeLabels () добавьте метку для reCAPTCHA:

 открытая функция attributeLabels ()

{

возвращаться [

'reCaptcha' => '',

];

} 

А пока я оставил его пустым.

Тестирование

Пришло время проверить форму. Откройте форму в браузере.

Вы заметите, что reCAPTCHA заменяет CAPTCHA. Используйте форму, чтобы узнать, правильно ли она проходит проверку.

Вам также может понравиться: Проверка подлинности пользователя в Yii2 с проверкой электронной почты

Заключение

В этом уроке я продемонстрировал, как вы можете заменить CAPTCHA, которая предустановлена ​​в Yii2, на reCAPTCHA. Не стесняйтесь оставлять свои комментарии, если у вас есть какие-либо вопросы относительно кода или вы думаете, что можете их улучшить.

Запускайте веб-сайты PHP, не беспокоясь об управлении сервером.

Предварительно установленный оптимизированный стек с Git, Composer и SSH

Ахмед Хан

Ахмед был экспертом сообщества PHP в Cloudways — облачной платформе управляемого хостинга PHP. Он инженер-программист с обширными знаниями в области PHP и SEO. В свободное время любит смотреть «Игру престолов». Подпишитесь на Ахмеда в Twitter, чтобы быть в курсе его работ. Вы можете написать ему по адресу [email protected]

.

×

Получите нашу рассылку новостей

Будьте первым, кто получит последние обновления и руководства.

Спасибо за подписку на нас!

Упрощенная авторизация на основе ролей в Yii 2.0 — {код ниндзя}

ОБНОВЛЕНИЕ: Начиная с версии 2.0.2, расширенный шаблон Yii2 по умолчанию не содержит столбца «роль» в таблице пользователей. Прежде чем переходить к руководству ниже, сделайте следующее:

  1. Создайте столбец с именем роль в таблице пользователей.
  2. Обновите модель User, добавив атрибут role и соответствующим образом обновив докблок класса User .

Yii 2.0 имеет встроенный контроль доступа, который поддерживает 2 роли из коробки, чтобы проверить, является ли пользователь гостем или вошел ли он в систему. Иногда возникает необходимость просто расширить уровень контроля доступа несколькими дополнительными роли, чтобы различать пользователей, вошедших в систему, т.е. admin , moderator , без полноценного графа RBAC с разрешениями, ролями и назначениями ролей, которые предоставляет Yii.

В этом посте я покажу, как реализовать простую авторизацию на основе ролей, просто расширив класс AccessRule , который определяет правила по умолчанию, и переопределив вызов функции matchRule () , который предоставит дополнительную логику сопоставления правил.

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

Давайте начнем с определения наших ролей.Я буду создавать две новые роли, а именно Admin и Moderator, в дополнение к существующей роли User . Эти роли позволят нам различать роли пользователей, вошедших в систему, а также позволяют ограничивать доступ к различным частям приложения в зависимости от роли, назначенной пользователю.

Давайте начнем с кода.


  1. Создайте класс AccessRule , который расширяет класс \ yii \ filters \ AccessRule .Я решил сделать это внутри пространства имен common \ components. Возможно, вам потребуется создать папку компонентов внутри общей папки. Заполните common \ components \ AccessRule.php следующим кодом:

    roles)) {
    вернуть истину;
    }
    foreach ($ this-> роли как $ role) {
    if ($ role === ‘?’) {
    if ($ user-> getIsGuest ()) {
    вернуть истину;
    }
    } elseif ($ role === ‘@’) {
    if (! $ user-> getIsGuest ()) {
    вернуть истину;
    }
    // Проверяем, авторизован ли пользователь и совпадают ли роли
    } elseif (! $ user-> getIsGuest () && $ role === $ user-> identity-> role) {
    вернуть истину;
    }
    }

    вернуть ложь;
    }
    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    140002

    14

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    0003

    0003

    общее пространство имен \ components;

    класс AccessRule extends \ yii \ filters \ AccessRule {

    / **

    * @inheritdoc

    * /

    защищенная функция matchRole ($ user)

    {

    (пусто) $ this-> roles)) {

    return true;

    }

    foreach ($ this-> роли как $ role) {

    if ($ role === ‘?’) {

    if ($ user-> getIsGuest ()) {

    return true;

    }

    } elseif ($ role === ‘@’) {

    if (! $ User-> getIsGuest ()) {

    return true;

    }

    // Проверяем, вошел ли пользователь в систему и совпадают ли роли.

    } elseif (! $ User-> getIsGuest () && $ role === $ user-> identity-> role) {

    вернуть истину;

    }

    }

    вернуть false;

    }

    }

    Здесь мы переопределяем функцию matchRole () .Большая часть кода matchRole () скопирована из класса \ yii \ filters \ AccessRule, за исключением того, что мы изменили последний оператор elseif, чтобы он соответствовал роли, предоставленной внутри контроллера, с ролью, определенной в базе данных и модели User.

  2. Внутри common / models / User.php мы определим наши новые роли. Уже есть
    const ROLE_USER = 10; в модели User. Мы добавим наши новые роли прямо под ним, чтобы наши константы ролей выглядели так:

    const ROLE_USER = 10;
    const ROLE_MODERATOR = 20;
    const ROLE_ADMIN = 30;

    const ROLE_USER = 10;

    const ROLE_MODERATOR = 20;

    const ROLE_ADMIN = 30;

  3. Пришло время использовать наши новые роли внутри контроллера. Чтобы использовать новые роли, мы воспользуемся новым компонентом AccessRule и внесем небольшие изменения в поведение access . Добавьте следующие операторы использования поверх вашего контроллера:

    используйте common \ components \ AccessRule;
    используйте common \ models \ User;

    использовать общие \ компоненты \ AccessRule;

    использовать common \ models \ User;

    Измените поведение доступа следующим образом:

    ‘доступ’ => [
    ‘class’ => AccessControl :: className (),
    // Мы заменим конфигурацию правила по умолчанию новым классом AccessRule
    ‘ruleConfig’ => [
    ‘class’ => AccessRule :: className (),
    ],
    ‘only’ => [‘создать’, ‘обновить’, ‘удалить’],
    ‘rules’ => [
    [
    ‘действия’ => [‘создать’],
    ‘allow’ => true,
    // Разрешить пользователям, модераторам и администраторам создавать
    ‘роли’ => [
    Пользователь :: ROLE_USER,
    Пользователь :: ROLE_MODERATOR,
    Пользователь :: ROLE_ADMIN
    ],
    ],
    [
    ‘actions’ => [‘update’],
    ‘allow’ => true,
    // Разрешить модераторам и администраторам обновлять
    ‘роли’ => [
    Пользователь :: ROLE_MODERATOR,
    Пользователь :: ROLE_ADMIN
    ],
    ],
    [
    ‘действия’ => [‘удалить’],
    ‘allow’ => true,
    // Разрешить администраторам удалять
    ‘роли’ => [
    Пользователь :: ROLE_ADMIN
    ],
    ],
    ],
    ],

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    140002

    14

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    000

    34

    35

    36

    37

    ‘access’ => [

    ‘class’ => AccessControl :: className (),

    // Мы переопределим конфигурацию правила по умолчанию с новым классом AccessRule

    ‘ruleConfig’ => [

    ‘class ‘=> AccessRule :: className (),

    ],

    ‘ only ‘=> [‘ create ‘,’ update ‘,’ delete ‘],

    ‘ rules ‘=> [

    [

    ‘ действия ‘=> [‘ create ‘],

    ‘ allow ‘=> true,

    // Разрешить пользователям, модераторам и администраторам создавать

    ‘ role ‘=> [

    User :: ROLE_USER,

    User :: ROLE_MODERATOR,

    User :: ROLE_ADMIN

    ],

    ],

    [

    ‘actions’ => [‘update’],

    ‘allow’ => true,

    // Разрешить модераторам и администраторам обновление

    ‘role’ => [

    User :: ROLE_MODERATOR,

    User :: ROLE_ADMIN

    ],

    ],

    [

    ‘actions’ => [‘delete’],

    ‘allow’ => true,

    // Разрешить администраторам удалять

    ‘role’ => [

    User :: ROLE_ADMIN

    ],

    ],

    ],

    ],

    В приведенном выше примере мы сначала переопределяем ruleConfig поведения доступа с помощью нашего нового класса AccessRule . Затем есть 3 действия создать , обновить и удалить , которые контролируются нашим новым классом AccessRule , и применяются следующие правила.

    • Действие создания доступно для ролей Пользователь , Модератор и Администратор .
    • Обновление Действия доступны для ролей Модератор и Администратор .
    • Удалить действие доступно только для роли администратора .

Вот и все. Чистая и простая авторизация на основе ролей для приложений, которые требуют большего, чем простая проверка входа в систему, но не требуют полноценного контроля доступа на основе ролей, предоставляемого Yii 2.0.

Дополнительная литература

http://www.yiiframework.com/doc-2.0/guide-security-authorization. html
http://www.yiiframework.com/doc-2.0/yii-filters-accessrule.html
http: // www .yiiframework.com / doc-2.0 / yii-filters-accesscontrol.html

Бонусная подсказка

Просмотрите исходный код Yii 2.0. Часто вы думаете: «Yii очень хорошо справляется с x , я бы хотел, чтобы он также делал x таким же образом». Благодаря тому, что Yii структурирован, очень легко расширить функциональность поверх основной библиотеки Yii без изменения основных файлов. Основной код Yii очень хорошо прокомментирован и организован, и это хороший источник для изучения самого PHP.

правил · b1b3b262b6342e32c4d66fd1f87317010c287a7f · yii2-extension / yii2-menu · GitLab

перейти к содержанию

  • Проектов
  • Группы
  • Фрагменты
  • Помощь
    • Загрузка…

  • Помощь

    • Помощь
    • Поддерживать
    • Форум сообщества

    • Горячие клавиши
      ?

    • Оставить отзыв
    • Внести свой вклад в GitLab

  • Войти

Переключить навигацию

Я

yii2-меню

  • Обзор проекта


    • Обзор проекта
    • Детали
    • Деятельность
    • Релизы
  • Репозиторий


    • Репозиторий
    • Файлы
    • Коммиты
    • Филиалы
    • Теги
    • Авторы
    • График
    • Сравнить
  • Этикетки

  • Запросы на слияние

    0


    • Запросы на слияние

      0

  • Пакеты и реестры


    • Пакеты и реестры
    • Реестр контейнеров

  • Аналитика


    • Аналитика
    • Репозиторий
    • поток создания ценности
  • Члены


    • Члены
  • Свернуть боковую панель

    Закрыть боковую панель

  • Мероприятия

  • График
  • Совершает

Открыть боковую панель

  • yii2-extension
  • yii2-menu

b1b3b262b6342e32c4d66fd1f87317010c287a7f

Переключатель ответвления / метки

Найти файл

Выберите формат архива

Скачать исходный код

застегивать
деготь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *