Symfony2のservices.ymlでコンテナに登録されたオブジェクトのメソッドを実行する方法

Symfony2のservices.ymlでコンテナに登録されたオブジェクトのメソッドを実行する方法

April 23, 2016,
tags: symfony php


このエントリーをはてなブックマークに追加

久しぶりにSymfonyネタでブログ書きます。

今回はservices.ymlでコンテナに登録されたオブジェクトのメソッドを実行する方法をご紹介します。

例えばyoutube apiをphpのサンプル

抜粋するとここの部分。

<?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が気になる人は、ぜひぜひ遊びにきてください。

comments powered by Disqus