サービスからリンクを生成するにはどうすればよいですか?サービス内に「ルーター」を挿入しましたが、生成されたリンクは/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'));
}
}
だから:あなたは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で導入)を使用します(続きを読む共有サービスについて)。
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');
}
// ...
}
私は 同様の問題 を抱えていましたが、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を返す場合があります。