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


10

私はサービス(およびdrupal 8!)に不慣れで、サービスを理解しようとしています。たぶん私は時代遅れの方法で作成しているだけだと思います。私がしたいことは、「helloジェネレータ」をサービスにして、別のコントローラで次のように呼び出すことです。

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'

あなたはドキュメントに従うことができます。これは、コントローラーでサービスを呼び出す正しい方法です
MrD

回答:


22

ここには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サービスの使用を開始する


4
公式ドキュメントがもっとこのスタイルになっているか、少なくともいくつかの概要記事があればいいのにと思います。実際のアプリケーションに簡単に変換できる一般的な例を使用した簡潔で簡潔なもの。
Nicolaj 2018

忘れないでください:use Symfony \ Component \ DependencyInjection \ ContainerInterface; コントローラクラス
Atep

@Nicolajのコメントには完全に同意しますが、これではうまくいきません...カスタムサービスを使用するつもりもありません。静的データベース接続オブジェクトを保持するクラスメンバー変数を作成するだけです。私は、接続プーリングを使用し、必要以上の接続を作成することが通常ではないシステムを使用することに慣れています。それでは、Drupalコントローラー/フォームに同様の何かをどのように実装しますか?
Kenny83

あなたはKenny83 @別の質問を開きたいかもしれませんが、あなたは見てきましたapi.drupal.org/api/drupal/core%21lib%21Drupal.php/function/...?これで次のようなことができます:gist.github.com/glaux/f4f1517563ddb57fb98b9213802c1569
Nicolaj

@Nicolaj LOL非常に明白な仲間を指摘してくれてありがとう:P私はコアデータベースサービスをよく知っており、それが私のcreate()メソッドから返そうとしているものです。私が他の何かを見逃していないのであれば明らかだったはずですが、サービス接続オブジェクトをプールしていると思いますか?
Kenny83
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.