web-dev-qa-db-ja.com

コントローラーでサービスを呼び出す正しい方法

私はサービスを初めて利用し(drupal 8!)、サービスを理解しようとしています。おそらく、私は古い方法で作成を行っているだけだと思います。 'hello generator'サービスを呼び出し、次のように別のコントローラーで呼び出します:

DBController.php

namespace Drupal\db\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\db\DbServices\HelloGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Response;


class DBController extends ControllerBase
{
private $helloGenerator;

public function __construct(HelloGenerator $x) {
    $this->helloGenerator = $x;
}
public function say($count) {
    $hello = $this->helloGenerator->getHello($count);

    return new Response($hello);
}

public static function create(ContainerInterface $container) {
    $x = $container->get('db.hello_generator');
    return new static ($x);
}
}

HellGenerator.php

名前空間Drupal\db\DbServices;

class HelloGenerator {

public function getHello($count) {
    $foo = 4 + 4 + 4;
    return $foo . ' ' . $count;
}

}

db.services.yml

services:
  db.hello_generator:
     class: Drupal\db\DbServices\HelloGenerator

db.db_says:
  path: /db/says/{count}
  defaults:
    _controller: '\Drupal\db\Controller\DBController::say'
  requirements:
    _permission: 'access content'
10
karl

ここには3つの質問があります。

  1. コントローラを作成するには?
  2. サービスを作成するには?
  3. コントローラでサービスを使用する方法は?

1.コントローラを作成する

1.1コントローラークラスを追加します-追加しました。その他 Drupalドキュメントを参照 を参照

1.2ルーティングファイルを追加します-これはコードにないようです:

my_module.routing.yml

_my_module.my_route_name:
  path: '/my/path'
  defaults:
    _controller: '\Drupal\my_module\Controller\MyController::myAction'
  requirements:
    _permission: 'access content'
_

Drupalドキュメントを参照 を参照

2.サービスを作成する

2.1サービスクラスを追加します-作成しました。

2.2ルーティングファイルを追加する-ルーティングファイルに属する追加のコードが含まれていますが、追加しました。これで十分です。

my_module.services.yml

_services:
  my_module.my_service:
    class: Drupal\my_module\Service\MyService
_

Drupalドキュメントを参照 を参照

3.コントローラでサービスを使用する

できたね。他の人への参照はここにあります:

3.1 create()メソッドをオーバーライドする

コントローラクラスはこのメソッドを_class ControllerBase_から継承します。その役割は、コントローラーオブジェクトを作成することです。メソッドの引数に注意してください。サービスコンテナに渡されます。必要なサービスを抽出してコンストラクタに渡します。

_public static function create(ContainerInterface $container) {
    $my_service = $container->get('my_module.my_service');
    $other_service = $container->get('other_service');

    return new static($my_service, $other_service);
}
_

3.2 __construct()でサービスを初期化する

_public function __construct($my_service, $other_service)
{
    $this->my_service = $my_service;
    $this->other_service = $other_service;
}
_

3.3サービスの使用を開始します

21
zendka