1

In a custom Service class, I need to check a config setting.

I'm able to do this using \Drupal::config(static::SETTINGS) as documented here: https://www.drupal.org/docs/drupal-apis/configuration-api/working-with-configuration-forms

but Coder complains:

WARNING | \Drupal calls should be avoided in classes, use dependency injection instead

What service should I inject here?

I only need to see the immutable config value, I don't think I need a ConfigFactory.

More info:

When I try to inject the ConfigFactoryInterface, using the pattern I have followed for many other services, I get this error:

Error: Call to undefined method Drupal\my_custom_module\Api\DataPartner::config() in Drupal\my_custom_module\Api\DataPartner->hasDebugPermission()

The code in the hasDebugPermission() method looks like this:

 /** * Private function to control whether displaying debug info is permitted. * * @return bool * TRUE if debugging is permitted for current user in current environment. */ private function hasDebugPermission() { $config = $this->config(static::SETTINGS); $result = DATA_PARTNER_FORMS_DEBUG && $config->get('display_debugging_info') && $this->account->hasPermission('debug forms'); return $result; } 

And I have declared static::SETTINGS like this:

 /** * Config settings. * * @var string */ private const SETTINGS = 'my_custom_module.settings'; 

The call to $this->account->hasPermission() works fine after injecting \Drupal\Core\Session\AccountInterface, but the call to $this->config('my_custom_module.settings')->get('display_debugging_info') does not work after injecting \Drupal\Core\Config\ConfigFactoryInterface.

1 Answer 1

4

Make sure you inject config.factory and then you need to use:

$this->config ->get('my_custom_module.settings') ->get('display_debugging_info'); 

You can see that Drupal::config() is:

public static function config($name) { return static::getContainer() ->get('config.factory') ->get($name); } 

So after injecting your service, the equivalent of \Drupal::config('my_custom_module.settings') is:

$this->config->get('my_custom_module.settings'); 
7
  • Perfect answer! You even ended on exactly the line where I forgot the ->get after $this->config. Thank you. Commented Aug 23, 2020 at 23:01
  • By the way, the bug in my code came straight from Drupal community documentation: drupal.org/docs/drupal-apis/configuration-api/… Commented Aug 24, 2020 at 2:59
  • 2
    Also note that the ConfigFormBase class uses the ConfigFormBaseTrait which defines a method config() which is not the same as simply naming your injected config factory service $config. You can see that method is a shortcut to the above, it's similar to calling \Drupal::config(). Commented Aug 24, 2020 at 13:10
  • 1
    @leymannx I fixed the line in the docs: drupal.org/node/2206607/revisions/view/11783167/12036988 Commented Aug 24, 2020 at 15:54
  • 2
    The docs were actually correct to begin with. As I tried to explain in the comment, ConfigFormBase has a config() method. Commented Aug 24, 2020 at 16:58

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.