如何根据 Symfony 中的用户角色加载具有不同值的参数?
How to load parameters with different values based on user role in Symfony?
我在 parameters.yml
文件中有很多参数,每个参数都应该根据登录用户的角色具有不同的值。
有没有办法根据登录用户的角色系统地决定和加载正确的值?
示例:
parameters:
user.address_code
manager.address_code
理想情况下,我不想在使用 address_code
.
之前在代码中为 manager
或 user
添加条件
由于在容器编译期间使用参数值,它们的值不能在运行时更改。
而且由于用户角色只能在请求时知道,所以你想做的事情根本做不到。
但是您很有可能是从错误的角度来解决问题的。
只需将逻辑封装在某种服务中即可。一个简单的例子:
服务:
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]);
}
}
这只是一个示例,但您可以根据需要进行调整。
我在 parameters.yml
文件中有很多参数,每个参数都应该根据登录用户的角色具有不同的值。
有没有办法根据登录用户的角色系统地决定和加载正确的值?
示例:
parameters:
user.address_code
manager.address_code
理想情况下,我不想在使用 address_code
.
manager
或 user
添加条件
由于在容器编译期间使用参数值,它们的值不能在运行时更改。
而且由于用户角色只能在请求时知道,所以你想做的事情根本做不到。
但是您很有可能是从错误的角度来解决问题的。
只需将逻辑封装在某种服务中即可。一个简单的例子:
服务:
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]);
}
}
这只是一个示例,但您可以根据需要进行调整。