web-dev-qa-db-ja.com

IPアドレスを取得する方法?

次のコードを使用しました。

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"は存在しないサービス "リクエスト"に依存しています。

8
neha

次のコードは私のために働きました:

use Symfony\Component\HttpFoundation;
$ip_address = Drupal::request()->getClientIp();
0
neha

ユーザーのIPアドレスを取得する および Symfony HttpFoundation に従って、ビジターのIPを取得できます

最初にuse Symfony\Component\HttpFoundation;を追加し、次に

 \Drupal::request()->getClientIp()
16
Yusef

これを行う正しい方法は、サービスインジェクションを使用することです。このようにして、クラスは単体テスト可能です。

あなたの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');
  }
}
4
phayes

受け取ったエラーから何がわかりますか?サービス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.'));
    }
  }
1
mradcliffe