Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Yii
Code

Как программировать с помощью Yii2: Blameable поведения

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called How to Program With Yii2.
How to Program With Yii2: Working With Asset Bundles
How to Program With Yii2: Timestamp Behavior

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

Final product image
What You'll Be Creating

Если вы спрашиваете: «Что такое Yii?» ознакомьтесь с моим предыдущим учебным пособием: Введение в Yii Framework, в котором рассматриваются преимущества Yii и которое включает обзор нового в Yii 2.0, выпущенного в октябре 2014 года.

В этой серии программирование с Yii2 я направляю читателей в использование недавно обновленного фреймворка для PHP Yii2. В этом учебном пособии я расскажу вам о другом интересном поведении Yii2: которое помогает автоматизировать общую задачу веб-разработки для установки свойств created by и updated by, а так же user_ids в моделях вашего веб приложения используя принцип DRY и Yii2 BlameableBehavior. Мы также создадим лог, в котором записываются данные о том, кто обновил записи в таблице Status.

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

Просто напоминание, я участвую в нижеуказанных комментариях. Меня особенно интересует, если у вас разные подходы, дополнительные идеи или вы хотите предложить темы для будущих учебников.

Что такое поведение?

Поведение Yii2 - это по существу миксины. Википедия описывает mixins как «класс, который содержит комбинацию методов из других классов. Как такая комбинация выполняется, зависит от языка, но это не наследование».

Yii описывает их следующим образом:

Прикрепление поведения к компоненту «внедряет» методы и свойства поведения в этот компонент, делая эти методы и свойства доступными, как если бы они были определены в самом классе компонента.

Yii2 предлагает несколько встроенных моделей поведения, большинство из которых мы будем документировать, включая sluggable (см. Программирование с Yii2: Sluggable Behavior), blameable и timestamp (скоро будут доступны, проверяйте страницу серии). Поведение - это простой способ повторно использовать общий код во многих ваших моделях данных, не дублируя этот код во многих местах. Внедрение поведения в модель часто может выполняться всего лишь парой строчек кода. По мере увеличения количества моделей в вашем приложении поведение становится все более полезным.

Что такое Blameable поведение?

Blameable позволяет нам легко выполнять часто заданную задачу по назначению текущего зарегистрированного пользователя для вставки и обновления в модели ActiveRecord, автоматически устанавливая свойства для created_by и updated_by.

В программировании с Yii2: авторизация с помощью фильтра контроля доступа мы реализовали наше собственное blameable поведение в двух частях. Сначала мы создали миграцию для добавления поля created_by в нашу таблицу Status:

Затем, мы назначили поле created_by текущему user_id в действии create у StatusController:

Реализация поведения Blameable сделает это автоматически для нас и может быть легко добавлена ко всем моделям ActiveRecord в вашем веб-приложении.

Реализация Blameable поведения в модели Status

Расширение таблицы Status

Во-первых, нам нужно еще раз расширить таблицу Status для поддержки поля updated_by.

Вот код миграции, который мы будем использовать:

Если вы попытаетесь выполнить эту миграцию с существующими данными в своей базе данных, вы получите сообщение об ошибке при попытке создать индекс внешнего ключа, потому что updated_by равен 0 и не существует в таблице пользователя.

Мы могли бы обойти это, обновив данные вручную в процессе миграции и затем добавив внешний ключ. Тем не менее, поскольку это тестовая платформа, проще всего просто мигрировать в три этапа: сбросить таблицу Status и ее тестовые данные, а затем снова выполнить миграцию:

Добавление BlameableBehavior в модель Status

Затем мы добавим BlameableBehavior в нашу модель Status. В models/Status.php мы добавляем BlameableBehavior после Sluggable:

Мы также должны включить поведение Blameable в верхней части нашей модели:

Затем мы удаляем required правило для created_by в правилах модели:

Вот так:

Это позволяет использовать валидацию и продолжить в поведении.

Мы также можем закомментировать или удалить установку created_by в StatusController в действии create:

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

Our Create Status form awaiting implementation of Blameable Behavior

И мы можем заглянуть в представление таблицы с помощью PHPMyAdmin и посмотреть настройки created_by и updated_by:

The Status Table After Blameable Behavior Updates

Логирование обновлений в таблице Status

Когда создается сообщение о статусе, мы всегда будем знать, кто создал изначальную запись. Но, с Blameable Behaviors, мы узнаем только того, кто  обновил запись последним.

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

Создание таблицы для StatusLog

Во-первых, нам нужно создать миграцию для StatusLog:

Затем мы кодируем миграцию, чтобы включить поля связи для идентификаторов таблицы последний и User полем updated_by:

Затем мы запускаем миграцию:

Самый быстрый способ создать модель для StatusLog (и CRUD-файлов, чтобы мы могли легко просматривать таблицу) с помощью генератора кода Yii2, Gii. Вы видели, как я использовал его в прошлых учебниках.

Откройте http://localhost:8888/hello/gii и создайте модель с этими настройками:

Gii Code Generator for Status Log Model

Вот настройки CRUD:

Gii Code Generator for Status Log CRUD Files

Затем мы расширяем событие AfterSave в модели Status:

Этот метод вызывает родительскую функцию по умолчанию для afterSave, но затем создает новую запись StatusLog, когда есть обновление строки Status:

Теоретически, мы могли бы также расширить BlameableBehavior, но поскольку вы должны убедиться, что есть модель журнала для каждой модели ActiveRecord, с которой вы ее используете, казалось, проще было создать эту функциональность в Status.

Если вы обновите несколько записей Status, вы можете просмотреть StatusLog с помощью Gii CRUD. На рисунке ниже показаны два изменения, сделанные Status.id 1.

Status Log CRUD Browser - The Update Log

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

Что дальше?

Надеюсь, вам было интересно узнать о Yii2 Behaviors и Blameable. Далее мы рассмотрим Timestamp Behaviors, которые уменьшают объем кода, который вам нужно написать с каждой новой моделью, для общей операции создания временных меток для вставок и обновлений.

Следите за новыми учебниками в моей серии статей Программирование с Yii2, где я продолжаю погружаться в разные аспекты фреймворка. Вы также можете посмотреть мою серию Создаем стартап на PHP, которая использует расширенный шаблон Yii2, где я создаю реальное приложение.

Я приветствую ваши пожелания по темам для уроков. Вы можете опубликовать их в комментариях ниже или отправить мне по электронной почте на моем веб-сайте Lookahead Consulting.

Если вы хотите узнать, когда выйдет следующий учебник Yii2, подпишитесь на меня @reifman в Twitter или посетите мою страницу инструктора. Моя страница инструктора будет включать все статьи из этой серии, как только они будут опубликованы.

Ссылки по теме

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.