Как загрузить параметры с разными значениями в зависимости от роли пользователя в Symfony? - PullRequest
1 голос
/ 14 февраля 2020

У меня есть множество параметров в файле parameters.yml, каждый параметр должен иметь свое значение в зависимости от роли пользователя, вошедшего в систему.

Есть ли способ систематически определять и загружать правильное значение на основе зарегистрированной роли пользователя?

Пример:

parameters:
    user.address_code
    manager.address_code

В идеале я не хочу добавлять условия в моем коде для manager или user, прежде чем использовать address_code.

1 Ответ

2 голосов
/ 14 февраля 2020

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

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

Но, скорее всего, вы подходите к проблеме не с того конца.

Просто заключите лог c в какую-то службу. Упрощенно c пример:

Служба:

namespace App\Service;

class FooService
{

    private array $configuration;

    public function __construct(array $configuration)
    {
        $this->configuration = $configuration;
    }

    public function getAddressCodeFor(string $role): string
    {
        return $this->configuration[$role] ?? '';
    }
}

Ваши параметры:

# services.yaml
parameters:
    address_code:
        ROLE_USER: 'foo'
        ROLE_ADMIN: 'bar'

Конфигурация, чтобы служба знала о ваших параметрах:

#services.yaml

App\Service\FooService:
    arguments: ['%address_code%']    

Тогда вам нужно только ввести FooService, где вам нужны эти значения, и вызвать getAddressCodeFor($role), где вам это нужно:

class FakeController extends AbstractController
{

    private FooService $paramService;

    public function __construct(FooService $service)
    {
        $this->paramService = $service;
    }

    public function someAction(): Response
    {
        $address_code = $this->paramService->getAddressCodeFor('ROLE_ADMIN');

        return $this->json(['address_code' => $address_code]);
    }

}

Это всего лишь пример, но вы можете настроить его в соответствии с вашими потребностями.

...