29

サービスからリンクを生成するにはどうすればよいですか?サービス内に「ルーター」を挿入しましたが、生成されたリンクはではありませ/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'));
    }
}
4

3 に答える 3

32

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

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

次に、サービスの範囲を「リクエスト」に設定する必要があります(私はそれを見逃しました)。 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に関する重要な注意ドキュメントにあるように、

この記事で説明されている「コンテナスコープ」の概念はSymfony2.8で非推奨になり、Symfony3.0で削除される予定です。

サービス/スコープの代わりにサービス(Symfony 2.4で導入)を使用し、request_stackスコープ(共有サービスの詳細を読む)の代わりに設定(Symfony 2.8で導入)を使用します。requestsharedprototype

于 2012-04-07T22:25:27.370 に答える
14

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');
    }

    // ...
}

于 2019-08-25T11:24:31.007 に答える
4

私も同様の問題を抱えていましたが、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が返される場合があります。

于 2017-04-26T13:08:39.847 に答える