Laravel Eloquent Отношения с репозиторием / шаблоном дизайна сервиса

В настоящее время я работаю над веб-приложением, которое было настроено с использованием шаблона проектирования репозитория / сервисного уровня, то есть у меня есть сервисный слой, который выполняет любую необходимую бизнес-логику перед запуском каких-либо методов в репозитории. У меня есть фасады для каждой из моих моделей, которые имеют доступ к соответствующим слоям обслуживания, и в большинстве случаев это нормально. Однако теперь, когда я пытаюсь установить отношения Eloquent, кажется, что фасады вызывают сильную головную боль, так как я не уверен, в каком направлении мне идти.

Возьмите следующий код:

class Account extends Eloquent {

// Our table name
protected $table = "accounts";

// Our primary key
protected $primaryKey = "id";

/**
*  Role Relationship
*
*  Returns a list of roles associated with
*  this account
*/
public function roles() {
return $this->hasMany('Role');
}

}

Это не будет работать как есть, потому что вместо использования класса сущности Role он использует Role Facade. Я нашел обходной путь для этого, установив псевдоним для сущности с немного другим именем, например, RoleEntity, чтобы

    public function roles() {
return $this->hasMany('RoleEntity');
}

будет работать, однако это не кажется самым оптимальным решением.

Мой вопрос, с практикой все в порядке? Или еще лучше, должно ли это происходить вообще? И если нет, как я могу это исправить / где я ошибся?

0

Решение

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

Я обычно использую \ Models, чтобы найти мои модели классов.

В верхней части каждого файла модели:

namespace Models;

В вашем контроллере или любой части вашего приложения:

\Models\Role::first();

Обратите внимание, что изменение пространства имен в вашей модели потребует от вас добавления пространств имен других классов, т. Е. Str, Eloquent, Url, Redirect и т. Д.

use Eloquent;
use URL;

В вашей модели вы также должны передать пространства имен в функции отношений, т.е.

public function roles() {
return $this->hasMany('\Models\Role');
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]