Cách chính xác để gọi một dịch vụ trong bộ điều khiển


10

Tôi mới sử dụng dịch vụ (và drupal 8!) Và đang cố gắng tìm ra các dịch vụ. Tôi nghĩ có lẽ tôi chỉ đang tạo ra một cách lỗi thời. Những gì tôi muốn làm là làm cho 'trình tạo xin chào' của tôi trở thành một dịch vụ và gọi nó trong một bộ điều khiển khác với các điều sau:

DBControll.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

không gian tên Drupal \ db \ DbService;

class HelloGenerator {

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

}

db.service.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'

Bạn có thể làm theo tài liệu . Đó là cách chính xác để gọi một dịch vụ trong bộ điều khiển
MrD

Câu trả lời:


21

Có 3 câu hỏi ở đây:

  1. Làm thế nào để tạo một bộ điều khiển?
  2. Làm thế nào để tạo ra một dịch vụ?
  3. Làm thế nào để sử dụng dịch vụ trong một bộ điều khiển?

1. Tạo bộ điều khiển

1.1 Thêm một lớp điều khiển - bạn đã làm nó. Đối với những người khác xem tài liệu Drupal

1.2 Thêm tệp định tuyến - có vẻ như mã này bị thiếu trong mã của bạn:

my_module.routing.yml

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

xem tài liệu Drupal

2. Tạo một dịch vụ

2.1 Thêm một lớp dịch vụ - bạn đã làm nó.

2.2 Thêm một tệp định tuyến - bạn đã làm nó mặc dù nó chứa mã bổ sung thuộc về tệp định tuyến. Đây là tất cả những gì bạn cần:

my_module.service.yml

services:
  my_module.my_service:
    class: Drupal\my_module\Service\MyService

xem tài liệu Drupal

3. Sử dụng dịch vụ trong bộ điều khiển

Bạn làm được rồi. Đây là một tài liệu tham khảo cho người khác:

3.1 Ghi đè create()phương thức

Lớp trình điều khiển kế thừa phương thức này từ class ControllerBase. Vai trò của nó là tạo đối tượng điều khiển. Xem đối số phương thức: nó được thông qua vùng chứa dịch vụ. Trích xuất các dịch vụ bạn cần và chuyển chúng cho hàm tạo:

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 Dịch vụ khởi tạo trong __construct()

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

3.3 Bắt đầu sử dụng dịch vụ


3
Tôi muốn tài liệu chính thức là nhiều hơn theo phong cách này, hoặc ít nhất là có một vài bài viết tổng quan đó là. Ngắn gọn và súc tích với một ví dụ chung dễ dàng dịch sang ứng dụng thực.
Nicolaj

Đừng quên: sử dụng Symfony \ Thành phần \ DependencyInjection \ ContainerInterface; trong lớp điều khiển
Atep

Mặc dù tôi hoàn toàn đồng ý với nhận xét của @ Nicolaj, nhưng điều này không hiệu quả với tôi ... và tôi thậm chí không cố gắng sử dụng dịch vụ tùy chỉnh! Tất cả những gì tôi muốn làm là tạo một biến thành viên lớp chứa một đối tượng kết nối cơ sở dữ liệu tĩnh. Tôi đã quen với việc sử dụng các hệ thống trong đó việc kết nối và không bao giờ tạo ra nhiều kết nối hơn mức bạn cần là tiêu chuẩn. Vậy làm thế nào tôi có thể thực hiện một cái gì đó tương tự trong bộ điều khiển / biểu mẫu Drupal?
Kenny83

Bạn có thể muốn mở một câu hỏi khác @ Kenny83, nhưng bạn đã xem api.drupal.org/api/drupal/core%21lib%21Drupal.php/feft/, chưa? Với điều đó, bạn có thể làm một cái gì đó như thế này: gist.github.com/glaux/f4f1517563ddb57fb98b9213802c1569
Nicolaj

@Nicolaj LOL cảm ơn vì đã chỉ ra người bạn đời dễ thấy: P Tôi nhận thức rõ về dịch vụ cơ sở dữ liệu cốt lõi và đó là điều tôi đang cố gắng trở lại từ create()phương pháp của mình . Tôi cho rằng bạn sẽ không nói rằng mặc dù nếu tôi không bỏ lỡ điều gì khác rõ ràng ... Tôi đoán dịch vụ đó có kết nối các đối tượng không?
Kenny83
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.