Сервисный класс Symfony2. Вызов функции

У меня есть такой сервис:

  services:
prodacom_authentication.encode:
class: Prodacom\AuthenticationBundle\Service\Encode
arguments: ["@security.context"]

сервисная функция, которую я хочу вызвать в контроллере:

public function encodePassword() {
$factory = $this->get('security.encoder_factory');
$user = new Prodacom\MainBundle\Entity\PdbUser();

$encoder = $factory->getEncoder($user);
$password = $encoder->encodePassword('ryanpass', $user->getSalt());
var_dump($password);
$user->setPassword($password);
}

я хочу вызвать функцию encodePassword в authenticationController.php.

    $this->get('prodacom_authentication.encode')->encodePassword();

но я продолжаю получать эту ошибку:

    Attempted to call method "get" on class "Prodacom\AuthenticationBundle\Service\Encode" in C:\htdocs\domeinbeheer\src\Prodacom\AuthenticationBundle\Service\Encode.php line 12.

есть идеи ???

0

Решение

Проблема во второй строке вашего метода, где вы вызываете: $this->get('security.encoder_factory')

В вашем сервисе метод get() не определено, если вы не реализовали это самостоятельно. Ваш контроллер имеет его, потому что он расширяет класс с именем ContainerAware, который реализует этот метод.

Теперь вы можете либо внедрить полный контейнер зависимостей (не рекомендуется), либо просто добавить нужные вам сервисы в ваш сервис. Вот список различных способов, которыми вы можете использовать для внедрения услуг в ваш сервис: http://symfony.com/doc/current/components/dependency_injection/types.html

Я видел, что вы уже знакомы с конструктором инъекций …

1

Другие решения

Если вы хотите использовать службу в другой, вы должны использовать внедрение зависимости.

$this->get() доступно только в контексте контроллера.

Вы найдете полный пример в официальной документации:
http://symfony.com/doc/2.3/components/dependency_injection/introduction.html

Заметка : Вы должны передать каждую услугу или параметры, которые вам нужны в инъекции.
Внедрить контейнер для вызова других служб может показаться более простым, но это плохая практика.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector