I alwaystend to follow Symfony standards when it comes to helper functions. So I normally have one module for developer-central stuff where I add a class under src/Utils
for helper methods.
Then I create a service for it that I can inject other services to and then call itthat itself can be injected everywhere I need it. Also
It can also be used in procedural code (hooks) in *.module
or *.theme
files easily.
namespace Drupal\my_module\Utils;
/**
* Class MyHelperFunctions.
*/
class MyHelperFunctions {
/**
* Get current multisite directory name.
*
* @return string
* The basename of the matching multisite directory.
*/
public function getMultisiteAlias() {
$site_path = \Drupal::service('site.path');
$site = explode('/', $site_path);
return $site[1];
}
}
namespace Drupal\my_module\Utils;
/**
* Class MyHelperFunctions.
*/
class MyHelperFunctions {
/**
* The Site path.
*
* @var string
*/
protected $sitePath;
/**
* MyHelperFunctions constructor.
*
* @param string $site_path
* The site path.
*/
public function __construct($site_path) {
$this->sitePath = $site_path;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('site.path')
);
}
/**
* Get current multisite directory name.
*
* @return string
* The basename of the matching multisite directory.
*/
public function getMultisiteAlias() {
$site_path = $this->sitePath;
$site = explode('/', $site_path);
return $site[1];
}
}
web/modules/themes/custom/my_thememy_module/my_thememy_module.themeservices.yml
use Drupal\my_module\Utils\MyHelperFunctions;
/**
* Implements template_preprocess_html().
*/
function my_theme_preprocess_html(&$variables) {
// Add multisite body class.
$site = MyHelperFunctions::getMultisiteAlias();
$variables['attributes']['class'][] = 'site-' . $site;
}
@NoSssweat suggested that the more Drupalitically correct way to do this would be to create a service to let that method be called by other modules via dependency injection as well.
services:
my_module.helper_functions:
class: Drupal\my_module\Utils\MyHelperFunctions
arguments: ['@site.path']
web/modules/themes/custom/my_modulemy_theme/my_module.servicesmy_theme.ymltheme
services:
my_module.helper_functions:
class: Drupal\my_module\Utils\MyHelperFunctions
And then you wouldn't need to use
the namespace anymore, but just can call the service wherever you want:
\Drupal::service('my_module.helper_functions')->getMultisiteAlias();
/**
* Implements template_preprocess_html().
*/
function my_theme_preprocess_html(&$variables) {
// Add multisite body class.
$site = \Drupal::service('my_module.helper_functions')->getMultisiteAlias();
$variables['attributes']['class'][] = 'site-' . $site;
}