Merge drupal-autowire/main

This commit is contained in:
Oliver Davies 2025-09-29 22:53:26 +01:00
commit 05a70b5a54
7 changed files with 168 additions and 0 deletions

View file

@ -0,0 +1,4 @@
# Autowire Example
An example module to demonstrate autowiring service classes in Drupal 8, as
well as how to define Controllers as Services.

View file

@ -0,0 +1,5 @@
name: 'Autowire Example'
type: module
description: 'An example module to demonstrate autowiring in Drupal 8.'
core: 8.x
package: 'Example modules'

View file

@ -0,0 +1,6 @@
autowire_example.user_count:
path: '/user-count'
defaults:
_controller: 'Drupal\autowire_example\Controller\ExampleController::__invoke'
requirements:
_access: 'TRUE'

View file

@ -0,0 +1,9 @@
services:
Drupal\Core\Entity\EntityTypeManagerInterface:
alias: entity_type.manager
Drupal\autowire_example\Controller\ExampleController:
autowire: true
Drupal\autowire_example\Service\UserCounter:
autowire: true

View file

@ -0,0 +1,48 @@
<?php
namespace Drupal\autowire_example\Controller;
use Drupal\autowire_example\Service\UserCounter;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* An example controller.
*/
class ExampleController {
use StringTranslationTrait;
/**
* The user counter service.
*
* @var \Drupal\autowire_example\Service\UserCounter
*/
private $userCounter;
/**
* ExampleController constructor.
*
* @param \Drupal\autowire_example\Service\UserCounter $user_counter
* The user counter service.
*/
public function __construct(UserCounter $user_counter) {
$this->userCounter = $user_counter;
}
/**
* Display the username of the current user.
*
* @return array
* A render array.
*/
public function __invoke() {
return [
'#markup' => $this->formatPlural(
number_format($this->userCounter->getActiveUserCount()),
'This site has 1 active user.',
'This site has @count active users.'
)
];
}
}

View file

@ -0,0 +1,46 @@
<?php
namespace Drupal\autowire_example\Service;
use Drupal\Core\Entity\EntityTypeManagerInterface;
/**
* A service to count users.
*/
class UserCounter {
/**
* The user storage instance.
*
* @var \Drupal\Core\Entity\EntityStorageInterface
*/
private $userStorage;
/**
* UserCounter constructor.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
public function __construct(EntityTypeManagerInterface $entity_type_manager) {
$this->userStorage = $entity_type_manager->getStorage('user');
}
/**
* Count the active users.
*
* @return integer
* The number of active users.
*/
public function getActiveUserCount() {
return (int) $this->userStorage
->getQuery()
->condition('status', 1)
->count()
->execute();
}
}

View file

@ -0,0 +1,50 @@
<?php
namespace Drupal\Tests\autowire_example\Kernel\Service;
use Drupal\autowire_example\Service\UserCounter;
use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
/**
* Test the user counter service.
*/
class UserCounterTest extends EntityKernelTestBase {
/**
* The user counter service.
*
* @var \Drupal\autowire_example\Service\UserCounter
*/
private $userCounter;
/**
* {@inheritdoc}
*/
public static $modules = ['autowire_example'];
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
$this->userCounter = $this->container->get(UserCounter::class);
}
/** @test */
public function active_users_are_counted() {
$this->createUser(['status' => 1]);
$this->createUser(['status' => 1]);
$this->assertEquals(2, $this->userCounter->getActiveUserCount());
}
/** @test */
public function blocked_users_are_not_counted() {
$this->createUser(['status' => 1]);
$this->createUser(['status' => 0]);
$this->assertEquals(1, $this->userCounter->getActiveUserCount());
}
}