Статьи

Красноречивые Мутаторы и Аксессоры в Ларавеле

В этой статье мы рассмотрим мутаторы и аксессоры Eloquent ORM в веб-фреймворке Laravel. После введения мы рассмотрим несколько примеров, чтобы понять эти концепции.

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

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

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

Я предполагаю, что вам известна модель Eloquent в Laravel, и мы будем использовать модель Post в качестве отправной точки нашего примера. Если вы еще не создали модель Post , давайте воспользуемся командой artisan для ее создания.

1
php artisan make:model Post —migration

Это должно создать файл модели в app/Post.php как показано ниже.

01
02
03
04
05
06
07
08
09
10
<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Post extends Model
{
    //
}

Давайте заменим содержимое этого файла следующим.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Post extends Model
{
    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = [
        ‘created_at’,
        ‘updated_at’,
        ‘published_at’
    ];
 
    /**
     * Get the post title.
     *
     * @param string $value
     * @return string
     */
    public function getNameAttribute($value)
    {
        return ucfirst($value);
    }
     
    /**
     * Set the post title.
     *
     * @param string $value
     * @return string
     */
    public function setNameAttribute($value)
    {
        $this->attributes[‘name’] = strtolower($value);
    }
}

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

1
php artisan migrate

Чтобы запустить примеры из этой статьи, вам нужно создать столбцы name и publ_at в таблице записей. В любом случае, мы не будем вдаваться в подробности темы миграции, поскольку она выходит за рамки этой статьи. Итак, вернемся к интересующим нас методам.

Во-первых, давайте пройдем через метод мутатора.

01
02
03
04
05
06
07
08
09
10
/**
  * Set the post title.
  *
  * @param string $value
  * @return string
  */
public function setNameAttribute($value)
{
    $this->attributes[‘name’] = strtolower($value);
}

Как мы уже говорили ранее, мутаторы используются для изменения данных перед их сохранением в базе данных. Как видите, синтаксис метода-мутатора set{attribute-name}Attribute . Конечно, вам нужно заменить {attribute-name} на фактическое имя атрибута.

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

Таким образом, вы можете создавать методы-мутаторы во всех столбцах таблицы. Далее, давайте рассмотрим метод доступа.

Если мутаторы используются для изменения данных до их сохранения в базе данных, метод доступа используется для изменения данных после их извлечения из базы данных. Синтаксис метода доступа такой же, как и у мутатора, за исключением того, что он начинается с ключевого слова get вместо ключевого слова set.

Давайте рассмотрим метод getNameAttribute .

01
02
03
04
05
06
07
08
09
10
/**
  * Get the post title.
  *
  * @param string $value
  * @return string
  */
public function getNameAttribute($value)
{
    return ucfirst($value);
}

Метод getNameAttribute будет вызываться после getNameAttribute значения атрибута name из базы данных. В нашем случае мы просто использовали метод ucfirst чтобы изменить заголовок поста.

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

Давайте создадим контроллер в app/Http/Controllers/MutatorController.php чтобы мы могли протестировать метод мутатора, который мы создали в предыдущем разделе.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?php
// app/Http/Controllers/MutatorController.php
namespace App\Http\Controllers;
 
use App\Post;
use App\Http\Controllers\Controller;
 
class MutatorController extends Controller
{
    public function index()
    {
        // create a new post object
        $post = new Post;
        $post->setAttribute(‘name’, ‘Post title’);
        $post->save();
    }
}

Кроме того, вам нужно создать связанный маршрут в файле routes/web.php для доступа к нему.

1
Route::get(‘mutator/index’, ‘MutatorController@index’);

В методе index мы создаем новый пост, используя модель Post . Он должен установить значение столбца name для публикации заголовка, так как мы использовали функцию strtolower в setNameAttribute мутатора setNameAttribute .

В дополнение к мутатору, который мы обсуждали ранее, модель Eloquent предоставляет несколько специальных мутаторов, которые позволяют изменять данные. Например, модель Eloquent в Laravel поставляется со специальным свойством $dates date, которое позволяет автоматически преобразовывать нужные столбцы в экземпляр даты Carbon .

В начале этой статьи мы создали модель Post , и следующий код был частью этого класса.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
/**
 * The attributes that should be mutated to dates.
 *
 * @var array
 */
protected $dates = [
    ‘created_at’,
    ‘updated_at’,
    ‘published_at’
];

Как вы, вероятно, знаете, Laravel всегда создает два связанных с датой поля, created_at и updated_at , с каждой миграцией базы данных. И он также преобразует эти значения в экземпляр даты Carbon .

Предположим, у вас есть пара полей в таблице, которые вы хотели бы рассматривать как поля даты. В этом случае вам просто нужно добавить имена столбцов в массиве $dates date.

Как видно из приведенного выше кода, мы добавили столбец publ_at в массив $dates date, и он гарантирует, что значение этого столбца будет преобразовано в экземпляр даты Carbon .

Чтобы увидеть аксессоры в действии, давайте создадим файл контроллера app/Http/Controllers/AccessorController.php со следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
namespace App\Http\Controllers;
 
use App\Post;
use App\Http\Controllers\Controller;
 
class AccessorController extends Controller
{
    public function index()
    {
        // load post
        $post = Post::find(1);
         
        // check the name property
        echo $post->name;
         
        // check the date property
        echo $post->published_at;
         
        // as we’ve mutated the published_at column as Carbon date, we can use following as well
        echo $post->published_at->getTimestamp();
        exit;
    }
}

Также давайте создадим связанный маршрут в файле routes/web.php для доступа к нему.

1
Route::get(‘accessor/index’, ‘AccessorController@index’);

В методе index мы сначала использовали модель Post чтобы загрузить пример сообщения.

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

Двигаясь дальше, мы проверили значение published столбца _at , и это следует рассматривать как дату. Благодаря этому Laravel преобразует его в экземпляр Carbon, чтобы вы могли использовать все служебные методы, предоставляемые этой библиотекой. В нашем случае мы использовали метод getTimestamp для преобразования даты в метку времени.

И это подводит нас к концу этой статьи!

Сегодня мы изучили концепции мутаторов и аксессоров Eloquent ORM в Laravel. Он предоставляет хороший способ изменить данные перед их сохранением и извлечением из базы данных.

Для тех из вас, кто только начинает работать с Laravel или хочет расширить свои знания, сайт или приложение с помощью расширений, у нас есть множество вещей, которые вы можете изучить на Envato Market .

Не стесняйтесь поделиться своими мыслями, используя канал ниже!