Вот мой образец кода
/**
* @Route("/two/factor", name = "google-authenticator")
*/
public function twoFactorAction(Request $request)
{
$user = $this->getUser();
$secret = $this->container->get("scheb_two_factor.security.google_authenticator")->generateSecret();
$user->setGoogleAuthenticatorSecret($secret);
$url = null;
if (!empty($user->getGoogleAuthenticatorSecret())){
$url = $this->container->get("scheb_two_factor.security.google_authenticator")->getUrl($user);
}
Вот ошибка
The "scheb_two_factor.security.google_authenticator" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.
Работает нормально. Но после обновления с Symfony 3.4 до 4.1 я получаю эту ошибку. пожалуйста дайте мне знать как мне это исправить быстро уважаемый.
Было 3,4. Но я обновился с некоторым устареванием. Собственно проблема именно в этой строке.
"$ this-> container-> get (" scheb_two_factor.security.google_aut henticator ") -> genera teSecret ();"
Сейчас он устарел. Но я не знаю, как я могу реализовать это каким-то новым способом.
Я удалил свой ответ - я не заметил, что вы сказали, что уже используете 3.4. Поскольку вы сейчас используете 4.1, вы можете напрямую передать службу в действие, если это проводной. Запустите bin/console debug:autowiring и посмотрите, доступна ли служба в отображаемом списке. Если это так, просто передайте его как аргумент с подсказкой типа в действие. Например, для автоматической проводной службы Foo\BarService сделайте function twoFactorAction(Request $request, Foo\BarService $barService), и ее можно будет использовать в ваших действиях.
Спасибо. Я использовал отладку bin / console: autowiring. Он не включал эту услугу. Могу ли я это сделать и как, если возможно. заранее спасибо
Интересно. Сделайте bin/console debug:autowiring | grep -i scheb на всякий случай. Какая версия schleb/two-factor-bundle у вас установлена? Вы должны увидеть это в своем composer.json.
Если вы используете версию 4 этой библиотеки, я мог бы предположить, что будут доступны псевдонимы автоподключения в нижняя часть этого конфигурационного файла.
Я использую версию 2.0 с уважением к windows
Здесь также путь к классу, который мне нужно использовать как подсказку типа
vendor \ Scheb \ TwoFactorBundle \ Security \ TwoFactor \ Provider \ Goo gle \ GoogleAuthentica tor
Вам приходилось вручную настраивать эту службу? Судя по документам 2.x, которые вы сделали. Если да, найдите эту конфигурацию (scheb_two_factor) и добавьте public: true
Да, нашел. Он находится в scheb_two_factor.yamal. И это ошибки, потому что puplic keword не поддерживается
Хорошо, спасибо за обновление - подозревал, что не получится. Я отправлю ответ с вашими вариантами, как я их вижу.
Спасибо уважаемый






Вы больше не можете использовать из контейнера, потому что модификаторы доступа. Попробуй воспользоваться автопроводкой.
Вы можете использовать этот интерфейс GoogleAuthenticatorInterface
Он исходит из того же пакета, который вы сейчас используете: Scheb И имейте это пространство имен:
Scheb\TwoFactorBundle\Security\TwoFactor\Provider\Google\GoogleAuthenticatorInterface;
Ваш метод выглядит так:
public function index(GoogleAuthenticatorInterface $twoFactor)
{
// ...
$secret = $twoFactor->generateSecret();
}
Я надеюсь, что эта страница может помочь вам немного больше, если мне что-то непонятно. создание секрета
обязательно укажите переменные, которые вы использовали, например $ request
На самом деле я немного использую старую связку. И не может обновляться по каким-то причинам. В старом пакете нет GoogleAuthenticatorInterface
Это правильный ответ, если OP использует версию 4, но я подозреваю, что это не так.
Я только что видел ваш комментарий Мухаммад - вы не (и не можете) использовать последнюю версию. Это хорошо знать.
Как уже говорилось, Symfony 4.1 позволяет вам внедрять сервисы с автоматическим подключением в действия вашего контроллера и в другие места. Однако вы используете старую (2.x) версию библиотеки scheb/two-factor, которая не определяет автоматические проводные службы.
Поскольку вы не можете обновить эту библиотеку до 4.x, вы несколько ограничены в своих возможностях. Однако должна быть возможность добавить Компилятор Pass для изменения конфигурации библиотеки scheb/two-factor в соответствии с вашими потребностями.
Короче говоря, Compiler Pass должен позволить вам переопределить эту службу как общедоступную, выполнив что-то вроде этого:
$container
->getDefinition('scheb_two_factor.security.google_authenticator')
->setPublic(true);
Вам нужно будет обратиться к документация, чтобы узнать, как реализовать передачу компилятора в ваше приложение.
Вы обновляли версию до 3.4?