Up until Drupal 8 there has been little to encourage well organised code. It now has PSR-4 autoloading so your classes are automatically included. Even though Drupal 8 is just round the corner, a lot of us will still be using Drupal 7 for quite a while, however that doesn’t mean we can’t benefit from this structure in Drupal 7.
This post covers two parts:
- Autoloading class files.
- Avoiding extra plumbing to hook into your class methods.
You’re probably familiar with
drupal_get_form(‘my_example_form’) which then looks for a function
my_example_form(). The issue is that your form definition will no longer be in such a function but within a method in a class. To cover both these parts we will be using two modules:
- XAutoLoad - Which will autoload our class.
- Cool - Which allows us to abstract the usual functions into class methods.
Drupal 8 was originally using PSR-0 which has been deprecated in favour of PSR-4. As a consequence the Cool module uses PSR-0 in its examples although it does support PSR-4. We will create an example module called
The information on autoloading and folder structure for PSR-4 in Drupal 8 states that we should place our form class in
psr4_form/src/Form/FormExample.php however the cool module instead loads from a
We can get round this by providing our own
hook_forms() as laid out in the Cool module:
If you are ok placing your class in the
FormControllers folder then you can omit the above function to keep your
.module file simple or you could put the hook in another module. Potentially the Cool module could be updated to reflect this.
This class requires a namespace of the form
Drupal\<module_name>\Form. It also extends the BaseForm class provided by the Cool module so we don’t need to explicitly create our form functions:
Within our FormExample class we need a method
getId() to expose the
form_id to Drupal:
And of course we need the form builder:
All that is left is to define your validate and submit methods following the Drupal 8 form API.
At the time of writing, the Cool module isn’t up to date with Drupal 8 Form API conventions. I started this blog post with the intention of a direct copy and paste of the src folder. Unfortunately the methods don’t quite follow the exact same conventions and they also need to be static:
|Drupal 7||Drupal 8|
This example module can be found at https://github.com/oliverpolden/psr4_form.
Taking it further
Drupal 8 is just round the corner but a lot of us will still be using Drupal 7 for the foreseeable future. Taking this approach allows us to learn and make use of Drupal 8 conventions as well as making it easier to migrate from Drupal 7. It would be nice to see the Cool module be brought up to date with the current API, perhaps something I will be helping with in the not so distant future.