In Drupal 7 module development, I could include a custom inc, api, or php class file using the file[]= directive in the module.info file or the drupal_load_included() function.

With D8 using PSR, what is the proper way to package up a "plain ole PHP object" and reference it in DefaultController.php? Think something like: $a = new POPO();.

Is just giving the PHP file containing the class a namespace sufficient? How does the controller (or module in general) know to reference or scan for that class?


You don't use file[] = ... anymore. Instead, classes are autoloaded. For example, I have a module with the following file structure:

  • views_hybrid/
    • views_hybrid.info.yml
    • views_hybrid.module
    • src/
      • Plugin/
        • Field/
          • FieldFormatter/
            • HybridFormatter.php

HybridFormatter.php defines a class called HybridFormatter.

In my .module file, if I start typing in my IDE (NetBeans in this case) HybridFormatter it autocompletes to \Drupal\views_hybrid\Plugin\Field\FieldFormatter\HybridFormatter:: because it is autoloaded. Since I don't want that whole path littering my module, at the top I have placed the line,

use Drupal\views_hybrid\Plugin\Field\FieldFormatter\HybridFormatter;

along with use directives for other classes I am including for use with my module.

The namespace is defined in HybridFormatter.php like so:

namespace Drupal\views_hybrid\Plugin\Field\FieldFormatter;

class HybridFormatter extends FormatterBase { ... }
  • So to ensure I fully understand, HybridFormatter.php will be autoloaded... automatically? There is no need for an include_once()? Does HybridFormatter.php have a namespace defined? – Rick Sep 3 '14 at 18:26
  • There is no need for include_once or require_once or anything. Hybridformatter.php does define a namespace. I'll include in the answer. – beth Sep 3 '14 at 18:44
  • @beth Can you help me ? drupal.stackexchange.com/questions/233565/… – RobinSon Apr 8 '17 at 7:03

I'd like to add that for including a custom class that doesn't fit into the D8 "plugin, controller, form, etc." defaults, you can still do so as noted PSR-4 overview here

For my use case, I dropped a "CustomClass.php" in /modules/custom/my_module/src/ At the beginning of the file I included the namespace declaration

namespace Drupal\my_module;

and in the file I wanted to use it in (in this particular case my_theme.theme) I added

use Drupal\my_module\CustomClass;

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.