web-dev-qa-db-ja.com

サービスからリンクを生成する

サービスからリンクを生成するにはどうすればよいですか?サービス内に「ルーター」を挿入しましたが、生成されたリンクは/view/42 の代わりに /app_dev.php/view/42。どうすればこれを解決できますか?

私のコードは次のようなものです:

services.yml

services:
    myservice:
        class: My\MyBundle\MyService
        arguments: [ @router ]

MyService.php

<?php

namespace My\MyBundle;

class MyService {

    public function __construct($router) {

        // of course, the die is an example
        die($router->generate('BackoffUserBundle.Profile.edit'));
    }
}
25
Maël Nison

だから:あなたは2つのものが必要になります。

まず、@ routerに依存する必要があります(generate()を取得するため)。

次に、サービスのスコープを「リクエスト」に設定する必要があります(私はそれを逃しました)。 http://symfony.com/doc/current/cookbook/service_container/scopes.html

きみの services.ymlは次のようになります。

services:
    myservice:
        class: My\MyBundle\MyService
        arguments: [ @router ]
        scope: request

これで、@ routerサービスのジェネレーター関数を使用できます。


symfony 3.xに関する重要な注意doc が言うように、

この記事で説明されている「コンテナスコープ」の概念はSymfony 2.8で廃止され、Symfony 3.0では削除されます。

使用 request_stackサービス(Symfony 2.4で導入)の代わりにrequestサービス/スコープを使用し、sharedスコープではなくprototype設定(Symfony 2.8で導入)を使用します(続きを読む共有サービスについて)。

31
Maël Nison

Symfony 4.xの場合、このリンクの指示に従う方がはるかに簡単です サービスでのURLの生成

UrlGeneratorInterfaceをサービスに挿入し、generate('route_name')を呼び出してリンクを取得するだけです。

// src/Service/SomeService.php
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class SomeService
{
    private $router;

    public function __construct(UrlGeneratorInterface $router)
    {
        $this->router = $router;
    }
    public function someMethod()
    {
        // ...

        // generate a URL with no route arguments
        $signUpPage = $this->router->generate('sign_up');
    }

    // ...
}

7
MAZux

私は 同様の問題 を抱えていましたが、Symfony 3を使用していました。前の回答では省略されていましたが、request_stackと同じことを達成するにはscope: request

この質問の場合、次のようになります。

Services.yml設定

services:
    myservice:
        class: My\MyBundle\MyService
        arguments:
            - '@request_stack'
            - '@router'

そしてMyServiceクラス

<?php

    namespace My\MyBundle;

    use Symfony\Component\Routing\RequestContext;

    class MyService {

        private $requestStack;
        private $router;

        public function __construct($requestStack, $router) {
            $this->requestStack = $requestStack;
            $this->router = $router;
        }

        public doThing() {
            $context = new RequestContext();
            $context->fromRequest($this->requestStack->getCurrentRequest());
            $this->router->setContext($context);
            // of course, the die is an example
            die($this->router->generate('BackoffUserBundle.Profile.edit'));
        }
    }

注:コンストラクターでのRequestStackへのアクセスは 推奨 です。カーネル。そのため、RequestStackからリクエストオブジェクトをフェッチしようとすると、nullを返す場合があります。

4
Jayd