Cara yang benar untuk memanggil layanan di pengontrol


10

Saya baru mengenal layanan (dan drupal 8!) Dan mencoba mencari tahu layanan. Saya pikir mungkin saya hanya melakukan pembuatan dengan cara yang ketinggalan zaman. Yang ingin saya lakukan adalah menjadikan layanan 'hello generator' saya dan menyebutnya di pengontrol lain dengan yang berikut:

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

namespace 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'

Anda dapat mengikuti dokumen . Ini cara yang benar untuk memanggil layanan di controller
MrD

Jawaban:


22

Ada 3 pertanyaan di sini:

  1. Bagaimana cara membuat pengontrol?
  2. Bagaimana cara membuat layanan?
  3. Bagaimana cara menggunakan layanan di controller?

1. Buat pengontrol

1.1 Tambahkan kelas pengontrol - Anda berhasil. Untuk yang lain lihat dokumentasi Drupal

1.2 Tambahkan file perutean - sepertinya ini tidak ada dalam kode Anda:

my_module.routing.yml

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

lihat dokumentasi Drupal

2. Buat layanan

2.1 Tambahkan kelas layanan - Anda berhasil.

2.2 Tambahkan file perutean - Anda melakukannya meskipun berisi kode tambahan milik file perutean. Ini yang Anda butuhkan:

my_module.services.yml

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

lihat dokumentasi Drupal

3. Gunakan layanan dalam pengontrol

Kamu berhasil. Berikut referensi untuk yang lain:

3.1 Ganti create()metode

Kelas controller mewarisi metode ini dari class ControllerBase. Perannya adalah untuk membuat objek pengontrol. Tonton argumen metode: itu melewati wadah layanan. Ekstrak layanan yang Anda butuhkan dan berikan kepada konstruktor:

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 Memulai layanan di __construct()

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

3.3 Mulai menggunakan layanan


4
Saya berharap dokumentasi resmi lebih dalam gaya ini, atau setidaknya memiliki beberapa artikel tinjauan umum. Singkat dan ringkas dengan contoh umum yang mudah diterjemahkan ke aplikasi nyata.
Nicolaj

A jangan lupa: gunakan Symfony \ Component \ DependencyInjection \ ContainerInterface; di kelas controller
Atep

Meskipun saya sepenuhnya setuju dengan komentar @ Nicolaj, ini tidak berfungsi untuk saya ... dan saya bahkan tidak mencoba menggunakan layanan khusus! Yang ingin saya lakukan adalah membuat variabel anggota kelas yang memegang objek koneksi database statis. Saya terbiasa menggunakan sistem di mana koneksi pooling dan tidak pernah membuat lebih banyak koneksi daripada yang Anda butuhkan adalah norma. Jadi, bagaimana saya mengimplementasikan sesuatu yang serupa di controller / form Drupal?
Kenny83

Anda mungkin ingin membuka pertanyaan lain @ Kenny83, tetapi apakah Anda sudah melihat api.drupal.org/api/drupal/core%21lib%21Drupal.php/function/… ? Dengan itu Anda dapat melakukan sesuatu seperti ini: gist.github.com/glaux/f4f1517563ddb57fb98b9213802c1569
Nicolaj

@Nicolaj LOL terima kasih telah menunjukkan pasangan yang sangat berdarah: P Saya sangat menyadari layanan database inti dan itulah yang saya coba untuk kembali dari create()metode saya . Saya kira Anda tidak akan mengatakan itu meskipun jika saya tidak melewatkan sesuatu yang seharusnya sudah jelas ... Saya kira layanan itu tidak objek koneksi kolam renang?
Kenny83
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.