次のコードを使用しました。
services:
foo:
class: Drupal\MYMODULE\Foo
arguments: ['@request']
MYMODULE/src/Foo.php
namespace Drupal\MYMODULE;
use Symfony\Component\HttpFoundation\Request;
class Foo {
/**
* @var \Symfony\Component\HttpFoundation\Request
*/
protected $request;
/**
* Constructs a Foo object.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request object.
*/
public function __construct(Request $request) {
$this->request = $request;
}
public function bar() {
if ($ip == $this->request->getClientIp()) {
drupal_set_message('ip', t('You may not ban your own IP address.'));
}
}
}
しかし、これは私にエラーを与えます:
Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException」というメッセージが表示され、「サービス "foo"は存在しないサービス "リクエスト"に依存しています。
次のコードは私のために働きました:
use Symfony\Component\HttpFoundation;
$ip_address = Drupal::request()->getClientIp();
ユーザーのIPアドレスを取得する および Symfony HttpFoundation に従って、ビジターのIPを取得できます
最初にuse Symfony\Component\HttpFoundation;
を追加し、次に
\Drupal::request()->getClientIp()
これを行う正しい方法は、サービスインジェクションを使用することです。このようにして、クラスは単体テスト可能です。
あなたのmymodule.services.yml
ファイル:
services:
foo:
class: Drupal\MYMODULE\Foo
arguments: ['@request_stack']
クラスで:
namespace Drupal\MYMODULE;
use Symfony\Component\HttpFoundation\RequestStack;
class Foo {
/**
* @var \Symfony\Component\HttpFoundation\Request
*/
protected $request;
/**
* Constructs a Foo object.
*
* @param Symfony\Component\HttpFoundation\RequestStack $request_stack
* The request stack object.
*/
public function __construct(RequestStack $request_stack) {
$this->request = $request_stack->getCurrentRequest();
}
public function bar() {
$ip == $this->request->getClientIp();
// Do something with $ip, just return it back as an exampe.
return $ip;
}
}
テストファイルで:
namespace Drupal\Tests\MYMODULE\Unit;
use Drupal\MYMODULE\Foo;
use Drupal\Tests\UnitTestCase;
use Prophecy\Argument;
class FooTest extends UnitTestCase {
public function testBar() {
$request = $this->prophesize('\Symfony\Component\HttpFoundation\Request');
$request->getClientIp()->willReturn('123.123.123.123');
$request = $request->reveal();
$request_stack = $this->prophesize('\Symfony\Component\HttpFoundation\RequestStack');
$request_stack->getCurrentRequest()->willReturn($request);
$request_stack = $request_stack->reveal();
$foo = new Foo($request_stack);
$this->assertEquals($foo->bar(), '123.123.123.123');
}
}
受け取ったエラーから何がわかりますか?サービスrequest
が存在しないことを示しています。 core.services.yml ファイルを読み取るコアによって読み込まれたリクエストを検索/発見し、request_stack
というサービスに似たものを発見することができます。
request_stack
サービスは Symfony\Component\HttpFoundation\RequestStack を提供し、現在のリクエストを取得できます。静的 \ Drupal :: request は、現在のリクエストを取得する実装例です。
public function __construct(RequestStack $requestStack) {
$this->request = $requestStack->getCurrentRequest();
}
public function bar() {
if ($ip == $this->request->getClientIp()) {
drupal_set_message('ip', t('You may not ban your own IP address.'));
}
}