2016年04月23日
Symfony2のservices.ymlでコンテナに登録されたオブジェクトのメソッドを実行する方法
久しぶりにSymfonyネタでブログ書きます。
今回はservices.ymlでコンテナに登録されたオブジェクトのメソッドを実行する方法をご紹介します。
抜粋するとここの部分。
<?php
...
$client = new Google_Client();
$client->setClientId($OAUTH2_CLIENT_ID);
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
$client->setScopes('https://www.googleapis.com/auth/youtube');
ここをservice.ymlで表現するとこんな感じ。
parameters:
youtube.client_id: "id"
youtube.client_secret: "xxxxxxxxxxxxxx"
youtube.scope: "https://www.googleapis.com/auth/youtube"
services:
youtube.google_client:
class: Google_Client
calls:
- ["setClientId",["%youtube.client_id%"]]
- ["setClientSecret",["%youtube.client_secret%"]]
- ["setScopes",["%youtube.scope%"]]
youtube.google_service_youtube:
class: Google_Service_YouTube
arguments:
- "@youtube.google_client"
ここまでは綺麗にかけます。
リダイレクトURIを設定する時にどうするべきか
リダイレクトURI指定するコードをどう書くか。 まずはGoogleのサンプルコードの場合。
<?php
...
$redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'],
FILTER_SANITIZE_URL);
$client->setRedirectUri($redirect);
この場合はコントローラとかないので、現在のページをリダイレクト先として設定しています。
しかしSymfony使うならRouter
を使ってURLを指定したいんですよね。
それをservices.ymlで表現したい。
services.ymlでRouter::generate()メソッドを実行する
悩んでたんですが、普通にドキュメントに記載されていました。 Using the Expression Language
ここに記載されている方法
services:
my_mailer:
class: Acme\HelloBundle\Mailer
arguments: ["@=service('mailer_configuration').getMailerMethod()"]
@=service()
を使えばコンテナに登録されているオブジェクトのメソッドが使えるみたいです。
parameters:
youtube.client_id: "id"
youtube.client_secret: "xxxxxxxxxxxxxx"
youtube.scope: "https://www.googleapis.com/auth/youtube"
services:
youtube.google_client:
class: Google_Client
calls:
- ["setClientId",["%youtube.client_id%"]]
- ["setClientSecret",["%youtube.client_secret%"]]
- ["setScopes",["%youtube.scope%"]]
- ["setRedirectUri",["@=service('router').generate('polidog_youtube_auth_index',[], 0)"]]
youtube.google_service_youtube:
class: Google_Service_YouTube
arguments:
- "@youtube.google_client"
こうやって書けば、router.generateメソッドが呼び出されて、setRedirectUriの設定ができるようになります。
最後に
ここまでservices.ymlで頑張る必要はない気もしますが、ちょっとした時便利な場合もあるので、ぜひぜひ試してみてください。
最後の最後に
明日は4/24はSymfony Meetup#11がヒトメディアさんで開催されます。
ちょっとでもSymfonyが気になる人は、ぜひぜひ遊びにきてください。