Правильный способ вызова службы в контроллере

10

Я новичок в сфере услуг (и 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'
Карлу
источник
Вы можете следить за документом . Это правильный способ вызова службы в контроллере
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 Начать пользоваться услугами

zendka
источник
4
Хотелось бы, чтобы официальная документация была больше в этом стиле или хотя бы имела несколько обзорных статей. Краткий и лаконичный общий пример, легко переводимый в реальное приложение.
Николай
А не забудьте: используйте 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 LOL спасибо за то, что указали на очевидно кровоточащего помощника: P Я хорошо знаю основной сервис баз данных, и это то, что я пытаюсь вернуть из своего create()метода. Я полагаю , вы не сказали бы , что , хотя , если бы я не пропустил что - то другое , что должно было быть очевидно ... Я думаю , что служба делает объекты связи бассейна?
Kenny83