1 回答

TA貢獻(xiàn)2011條經(jīng)驗 獲得超2個贊
我從未完全解開正確裝飾其構(gòu)造函數(shù)由 DI 擴(kuò)展動態(tài)注入的服務(wù)的謎團(tuán)。
但是,在這種情況下,您真正需要做的就是更改內(nèi)存提供程序的類,這可以在內(nèi)核中的編譯器傳遞中完成:
# src\Kernel.php
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use App\User\InMemoryUserProvider;
class Kernel extends BaseKernel implements CompilerPassInterface
...
public function process(ContainerBuilder $container)
{
$id = 'security.user.provider.in_memory';
$container->getDefinition($id)->setClass(InMemoryUserProvider::class);
}
在測試此功能時,我最初嘗試擴(kuò)展內(nèi)存提供程序中的現(xiàn)有核心,但它使用無法覆蓋的私有方法。所以我只是重新實現(xiàn)了完整的接口
namespace App\User;
class InMemoryUserProvider implements UserProviderInterface
{
public function __construct(array $users)
{
dump($users); // Confirms get the users from security.yaml
}
public function loadUserByUsername(string $username)
{
// TODO: Implement loadUserByUsername() method.
echo "Get User {$username}\n";
}
確認(rèn)它已按預(yù)期接線:
bin/console debug:container | grep UserProv
App\User\InMemoryUserProvider = App\User\InMemoryUserProvider
Symfony\Component\Security\Core\User\UserProviderInterface = alias for "security.user.provider.concrete.users_in_memory"
security.user.provider.concrete.users_in_memory = App\User\InMemoryUserProvider
security.user.provider.in_memory = App\User\InMemoryUserProvider
并發(fā)出一個命令來驗證它是否按預(yù)期工作:
class UserProviderCommand extends Command
{
protected static $defaultName = 'user:provider';
private $userProvider;
public function __construct(UserProviderInterface $userProvider)
{
parent::__construct();
$this->userProvider = $userProvider;
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
echo "User Provider: " . get_class($this->userProvider) . "\n";
$this->userProvider->loadUserByUsername('xxx');
return 0;
}
}
- 1 回答
- 0 關(guān)注
- 172 瀏覽
添加回答
舉報