Один из параметров, которые я хочу передать службе при ее создании, является результатом вычисления строки, основанного на некоторых пользовательских вводах. Как это может быть достигнуто автоматически, так что мне не нужно передавать значения в объект каждый раз, когда я хочу получить к нему доступ с другого контроллера?
Для иллюстрации я добавляю следующий пример:
Я инкапсулировал Instagram API в Сервис, следуя документации (блестящей), поэтому записывая $instagram = $this->get('instagram');
в моем коде почти работает, так как для связи с API мне нужно также установить URL-адрес обратного вызова, который я всегда должен делать после получения службы, например:
$redirect_url = $this->getRequest()->getSchemeAndHttpHost().$this->generateUrl('_instagram_authenticate_response'); $instagram = $this->get('instagram'); $instagram->setApiCallback($redirect_url);
Это нормально делать это один раз, но не в каждом методе фриланса, который я использую, когда я разговариваю с instagram. Пожалуйста помоги 🙂
Обновление: определение моего сервиса выглядит следующим образом:
parameters: client_id: xxxxx client_secret: yyyyy services: instagram: class: Clops\InstagramBundle\InstagramAPI arguments: ["%client_id%", "%client_secret%"]
Вопрос в том, что -> как передать третий параметр в качестве значения, сгенерированного в контроллере? Или мне всегда нужно делать это через setValue (X) после получения услуги?
Это похоже на проблему инъекций зависимостей.
Как упоминалось, вам просто нужно передать @router
и @request
в качестве параметра вашего сервиса.
Тем не менее, это кажется единственной зависимостью, потому что мой образ мышления
Вы должны создать метод handleApiCallback
который будет вызван сразу после instanciation, в котором вы передадите @router
и @request
Это позволяет вашему классу не сильно привязываться к Symfony
В качестве дополнительной заметки вы не можете напрямую передать @request
в качестве параметра, вам нужно объявить свою службу как request-scoped
services.yml
services: instagram: class: Clops\InstagramBundle\InstagramAPI scope: request arguments: - %client_id% - %client_secret% calls: - [ handleApiCallback, [ @request, @router ] ]
Clops \ InstagramBundle \ InstagramAPI
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\RouterInterface; class InstagramApi { public function handleApiCallback(Request $request, RouterInterface $router) { $host = $request->getSchemeAndHttpHost(); $route = $router->generateUrl('_instagram_authenticate_response'); $uri = $host.$route; $this->setApiCallback($uri); } }
Вы можете создать свой параметр внутри службы. В вашей ситуации вы можете передать request
и router
для обслуживания и выполнения работы.
Создайте базовый контроллер, который будет иметь метод getInstagram()
.
public function getInstagram() { $redirect_url = $this->getRequest()->getSchemeAndHttpHost().$this->generateUrl('_instagram_authenticate_response'); $instagram = $this->get('instagram'); $instagram->setApiCallback($redirect_url); return $instagram; }