У меня есть такой сервис:
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.
есть идеи ???
Проблема во второй строке вашего метода, где вы вызываете: $this->get('security.encoder_factory')
В вашем сервисе метод get()
не определено, если вы не реализовали это самостоятельно. Ваш контроллер имеет его, потому что он расширяет класс с именем ContainerAware
, который реализует этот метод.
Теперь вы можете либо внедрить полный контейнер зависимостей (не рекомендуется), либо просто добавить нужные вам сервисы в ваш сервис. Вот список различных способов, которыми вы можете использовать для внедрения услуг в ваш сервис: http://symfony.com/doc/current/components/dependency_injection/types.html
Я видел, что вы уже знакомы с конструктором инъекций …
Если вы хотите использовать службу в другой, вы должны использовать внедрение зависимости.
$this->get()
доступно только в контексте контроллера.
Вы найдете полный пример в официальной документации:
http://symfony.com/doc/2.3/components/dependency_injection/introduction.html
Заметка : Вы должны передать каждую услугу или параметры, которые вам нужны в инъекции.
Внедрить контейнер для вызова других служб может показаться более простым, но это плохая практика.