Учение о сущности Расширение функционала - PullRequest
0 голосов
/ 23 сентября 2019

Я использую учение с Symfony.У меня есть сущность Пользователь .

Я хочу иметь различные классы для этого Пользовательской сущности

  • UserApi (->toArray() с некоторыми данными ),
  • UserSite (->toArray() с другими данными )
  • UserAdmin ( другие специфические методы ),

у этих моделей те же данные (свойства), но разная функциональность

Как я могу это получить?


Мне не нужны разные модели.

Мне нужна ОДНА модель и несколько представлений.

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Использование наследование одной таблицы .

Модели будут разделяться столбцом дискриминатора.

1 голос
/ 23 сентября 2019

Если вы используете FOS/user-bundle, вы можете назначать роли пользователей, вы можете создавать свои собственные или использовать предопределенные (предварительно определено Admin).https://symfony.com/doc/2.0.x/bundles/FOSUserBundle/index.html

Если вы действительно хотите сделать это самостоятельно, у вас может быть одна модель, но разные экземпляры, это то, что вы настраиваете пользователя на использование bool для определения его роли, а затем создаете новый объект по запросуна основе ролей:

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 * @ORM\Table(name="users")
 */
class User
{

    /** @Column(name="`isApiUser`", type="boolean") */
    private $isApiUser;

    /** @Column(name="`isSiteUser`", type="boolean") */
    private $isSiteUser;

    /** @Column(name="`isAdminUser`", type="boolean") */
    private $isAdminUser;

    //....
    public function getApiUser(): ?ApiUser
    {
        return $this->isApiUser() ? new ApiUser($this) : null;
    }

    public function getSiteUser(): SiteUser
    {
        return $this->isSiteUser() ? new SiteUser($this) : null;
    }

    public function getAdminUser(): ApiUser
    {
        return $this->isAdminUser() ? new AdminUser($this);
    }
    //....

}

Затем пусть каждый пользовательский объект сделает что-то вроде:

class ApiUser
{
    private $userName;

    public function __construct(User $user)
    {
        $this->userName = $user->getUserName();
        // Continue for whatever logic you want
    }

}

Сделайте то же самое для каждого из пользовательских типов.

Затем, когда вы захотите использовать его в своем контроллере (или там, где угодно)

class SomeController extends Controller
{
    public function indexAction()
    {

        $repository = $this->getDoctrine()->getRepository(User::class);

        $user = $product = $repository->findOneBy([
            'userName' => 'UserName', 
            'isApiUser' => true
        ]);
        $apiUser = $this->getApiUser();
    }

}

...