Рубрики
Uncategorized

Инкапсулирование красноречивой ассоциации laravel с помощью PHP-командировок

Автор оригинала: David Wong.

Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t…

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

Поэтому я буду использовать почтовую модель для демонстрации. Это выглядит так:

php

namespace App;

use Illuminate\Database\Eloquent\Model;

/**
 * Class Post
 *
 * @package App
 */
class Post extends Model
{
    /**
     * @return string
     */
    public function getTitle()
    {
        return $this->getAttribute('title');
    }

    /**
     * @param string $title
     * @return $this
     */
    public function setTitle(string $title)
    {
        $this->setAttribute('title', $title);

        return $this;
    }

    /**
     * @return string
     */
    public function getPost()
    {
        return $this->getAttribute('post');
    }

    /**
     * @param string $post
     * @return $this
     */
    public function setPost(string $post)
    {
        $this->setAttribute('post', $post);

        return $this;
    }

    /**
     * @param Account $account
     * @return $this
     */
    public function setAccount(Account $account)
    {
        $this->account()->associate($account);

        return $this;
    }

    /**
     * @return Account|null;
     */
    public function getAccount()
    {
        return $this->getAttribute('account');
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function account()
    {
        return $this->belongsTo(Account::class, 'account_id', 'id');
    }
}

Мы определили несколько методов, один для атрибута post, а другой для отношения ассоциации.

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

Использование черт

Определение торговли:

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

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

Это идеальная причина для использования черт характера. Мы создаем тропу под названием hasaccounttrail, которая сохранит все методы всех отношений, принадлежащих одной учетной записи:

account()->associate($account);

        return $this;
    }

    /**
     * @return Account|null;
     */
    public function getAccount()
    {
        return $this->getAttribute('account');
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function account()
    {
        return $this->belongsTo(Account::class, 'account_id', 'id');
    }
}

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

getAttribute('title');
    }

    /**
     * @param string $title
     * @return $this
     */
    public function setTitle(string $title)
    {
        $this->setAttribute('title', $title);

        return $this;
    }

    /**
     * @return string
     */
    public function getPost()
    {
        return $this->getAttribute('post');
    }

    /**
     * @param string $post
     * @return $this
     */
    public function setPost(string $post)
    {
        $this->setAttribute('post', $post);

        return $this;
    }
}

резюме

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