123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- <?php
- namespace Drupal\Core\Controller;
- use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
- use Drupal\Core\Logger\LoggerChannelTrait;
- use Drupal\Core\Routing\LinkGeneratorTrait;
- use Drupal\Core\Routing\RedirectDestinationTrait;
- use Drupal\Core\Routing\UrlGeneratorTrait;
- use Drupal\Core\StringTranslation\StringTranslationTrait;
- use Drupal\Core\Url;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- use Drupal\Core\Messenger\MessengerTrait;
- use Symfony\Component\HttpFoundation\RedirectResponse;
- /**
- * Utility base class for thin controllers.
- *
- * Controllers that use this base class have access to a number of utility
- * methods and to the Container, which can greatly reduce boilerplate dependency
- * handling code. However, it also makes the class considerably more
- * difficult to unit test. Therefore this base class should only be used by
- * controller classes that contain only trivial glue code. Controllers that
- * contain sufficiently complex logic that it's worth testing should not use
- * this base class but use ContainerInjectionInterface instead, or even
- * better be refactored to be trivial glue code.
- *
- * The services exposed here are those that it is reasonable for a well-behaved
- * controller to leverage. A controller that needs other services may
- * need to be refactored into a thin controller and a dependent unit-testable
- * service.
- *
- * @see \Drupal\Core\DependencyInjection\ContainerInjectionInterface
- *
- * @ingroup routing
- */
- abstract class ControllerBase implements ContainerInjectionInterface {
- use LinkGeneratorTrait;
- use LoggerChannelTrait;
- use MessengerTrait;
- use RedirectDestinationTrait;
- use StringTranslationTrait;
- use UrlGeneratorTrait;
- /**
- * The entity manager.
- *
- * @var \Drupal\Core\Entity\EntityManagerInterface
- */
- protected $entityManager;
- /**
- * The entity type manager.
- *
- * @var \Drupal\Core\Entity\EntityTypeManagerInterface
- */
- protected $entityTypeManager;
- /**
- * The entity form builder.
- *
- * @var \Drupal\Core\Entity\EntityFormBuilderInterface
- */
- protected $entityFormBuilder;
- /**
- * The language manager.
- *
- * @var \Drupal\Core\Language\LanguageManagerInterface
- */
- protected $languageManager;
- /**
- * The configuration factory.
- *
- * @var \Drupal\Core\Config\ConfigFactoryInterface
- */
- protected $configFactory;
- /**
- * The key-value storage.
- *
- * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface
- */
- protected $keyValue;
- /**
- * The current user service.
- *
- * @var \Drupal\Core\Session\AccountInterface
- */
- protected $currentUser;
- /**
- * The state service.
- *
- * @var \Drupal\Core\State\StateInterface
- */
- protected $stateService;
- /**
- * The module handler.
- *
- * @var \Drupal\Core\Extension\ModuleHandlerInterface
- */
- protected $moduleHandler;
- /**
- * The form builder.
- *
- * @var \Drupal\Core\Form\FormBuilderInterface
- */
- protected $formBuilder;
- /**
- * {@inheritdoc}
- */
- public static function create(ContainerInterface $container) {
- return new static();
- }
- /**
- * Retrieves the entity manager service.
- *
- * @return \Drupal\Core\Entity\EntityManagerInterface
- * The entity manager service.
- *
- * @deprecated in drupal:8.0.0 and is removed from drupal:9.0.0.
- * Most of the time static::entityTypeManager() is supposed to be used
- * instead.
- */
- protected function entityManager() {
- @trigger_error('ControllerBase::getEntityManager() is deprecated in Drupal 8.7.0 and will be removed before Drupal 9.0.0. Use ::getEntityTypeManager() instead. See https://www.drupal.org/node/2549139.', E_USER_DEPRECATED);
- if (!$this->entityManager) {
- $this->entityManager = $this->container()->get('entity.manager');
- }
- return $this->entityManager;
- }
- /**
- * Retrieves the entity type manager.
- *
- * @return \Drupal\Core\Entity\EntityTypeManagerInterface
- * The entity type manager.
- */
- protected function entityTypeManager() {
- if (!isset($this->entityTypeManager)) {
- $this->entityTypeManager = $this->container()->get('entity_type.manager');
- }
- return $this->entityTypeManager;
- }
- /**
- * Retrieves the entity form builder.
- *
- * @return \Drupal\Core\Entity\EntityFormBuilderInterface
- * The entity form builder.
- */
- protected function entityFormBuilder() {
- if (!$this->entityFormBuilder) {
- $this->entityFormBuilder = $this->container()->get('entity.form_builder');
- }
- return $this->entityFormBuilder;
- }
- /**
- * Returns the requested cache bin.
- *
- * @param string $bin
- * (optional) The cache bin for which the cache object should be returned,
- * defaults to 'default'.
- *
- * @return \Drupal\Core\Cache\CacheBackendInterface
- * The cache object associated with the specified bin.
- */
- protected function cache($bin = 'default') {
- return $this->container()->get('cache.' . $bin);
- }
- /**
- * Retrieves a configuration object.
- *
- * This is the main entry point to the configuration API. Calling
- * @code $this->config('book.admin') @endcode will return a configuration
- * object in which the book module can store its administrative settings.
- *
- * @param string $name
- * The name of the configuration object to retrieve. The name corresponds to
- * a configuration file. For @code \Drupal::config('book.admin') @endcode,
- * the config object returned will contain the contents of book.admin
- * configuration file.
- *
- * @return \Drupal\Core\Config\Config
- * A configuration object.
- */
- protected function config($name) {
- if (!$this->configFactory) {
- $this->configFactory = $this->container()->get('config.factory');
- }
- return $this->configFactory->get($name);
- }
- /**
- * Returns a key/value storage collection.
- *
- * @param string $collection
- * Name of the key/value collection to return.
- *
- * @return \Drupal\Core\KeyValueStore\KeyValueStoreInterface
- */
- protected function keyValue($collection) {
- if (!$this->keyValue) {
- $this->keyValue = $this->container()->get('keyvalue')->get($collection);
- }
- return $this->keyValue;
- }
- /**
- * Returns the state storage service.
- *
- * Use this to store machine-generated data, local to a specific environment
- * that does not need deploying and does not need human editing; for example,
- * the last time cron was run. Data which needs to be edited by humans and
- * needs to be the same across development, production, etc. environments
- * (for example, the system maintenance message) should use config() instead.
- *
- * @return \Drupal\Core\State\StateInterface
- */
- protected function state() {
- if (!$this->stateService) {
- $this->stateService = $this->container()->get('state');
- }
- return $this->stateService;
- }
- /**
- * Returns the module handler.
- *
- * @return \Drupal\Core\Extension\ModuleHandlerInterface
- */
- protected function moduleHandler() {
- if (!$this->moduleHandler) {
- $this->moduleHandler = $this->container()->get('module_handler');
- }
- return $this->moduleHandler;
- }
- /**
- * Returns the form builder service.
- *
- * @return \Drupal\Core\Form\FormBuilderInterface
- */
- protected function formBuilder() {
- if (!$this->formBuilder) {
- $this->formBuilder = $this->container()->get('form_builder');
- }
- return $this->formBuilder;
- }
- /**
- * Returns the current user.
- *
- * @return \Drupal\Core\Session\AccountInterface
- * The current user.
- */
- protected function currentUser() {
- if (!$this->currentUser) {
- $this->currentUser = $this->container()->get('current_user');
- }
- return $this->currentUser;
- }
- /**
- * Returns the language manager service.
- *
- * @return \Drupal\Core\Language\LanguageManagerInterface
- * The language manager.
- */
- protected function languageManager() {
- if (!$this->languageManager) {
- $this->languageManager = $this->container()->get('language_manager');
- }
- return $this->languageManager;
- }
- /**
- * Returns a redirect response object for the specified route.
- *
- * @param string $route_name
- * The name of the route to which to redirect.
- * @param array $route_parameters
- * (optional) Parameters for the route.
- * @param array $options
- * (optional) An associative array of additional options.
- * @param int $status
- * (optional) The HTTP redirect status code for the redirect. The default is
- * 302 Found.
- *
- * @return \Symfony\Component\HttpFoundation\RedirectResponse
- * A redirect response object that may be returned by the controller.
- */
- protected function redirect($route_name, array $route_parameters = [], array $options = [], $status = 302) {
- $options['absolute'] = TRUE;
- return new RedirectResponse(Url::fromRoute($route_name, $route_parameters, $options)->toString(), $status);
- }
- /**
- * Returns the service container.
- *
- * This method is marked private to prevent sub-classes from retrieving
- * services from the container through it. Instead,
- * \Drupal\Core\DependencyInjection\ContainerInjectionInterface should be used
- * for injecting services.
- *
- * @return \Symfony\Component\DependencyInjection\ContainerInterface
- * The service container.
- */
- private function container() {
- return \Drupal::getContainer();
- }
- }
|