diff --git a/source/_posts/2016-05-03-simplifying-drupal-migrations-with-xautoload.md b/source/_posts/2016-05-03-simplifying-drupal-migrations-with-xautoload.md new file mode 100644 index 00000000..206e60d5 --- /dev/null +++ b/source/_posts/2016-05-03-simplifying-drupal-migrations-with-xautoload.md @@ -0,0 +1,106 @@ +--- +title: Simplifying Drupal Migrations with xautoload +nav: blog +tags: + - autoloading + - drupal + - drupal-planet + - drupal-7 + - php +draft: yes +--- +{% block excerpt %} +How to use the [xautoload][1] module to autoload migration classes within your Drupal 7 migration modules. +{% endblock %} + +{% block content %} +## What is xautoload? + +[xautoload][1] is a Drupal module that enables autoloading PHP classes, in the same way that you would do so in a [Composer][2] project such as Drupal 8 or Symfony. + +It supports both the [PSR-0][3] and [PSR-4][4] standards, as well as providing a wildcard syntax for the Drupal `file[]` syntax in .info files. + +To use it, download and enable it from Drupal.org as you would for any other module. + +### Wildcard syntax for .info files + +Here is an example .info file for a migrate module. + +```ini +; foo_migrate.info + +name = Foo Migration +core = 7.x +package = Foo + +files[] = includes/user.inc +files[] = includes/nodes/article.inc +files[] = includes/nodes/page.inc +``` + +In this example, each custom migration class is stored in it’s own file within the `includes` directory, and each class needs to be loaded separately using the `files[] = filename` syntax. + +One thing that the xautoload module does is allow for the use of wildcards within .info files. By using this, the module file can be simplified as follows: + +``` +files[] = includes/**/*.inc +``` + +This will load any .inc files within the `includes` directory as well as any sub-directories, like 'node' in the original example. + +This means that any new migration classes that are added will be automatically loaded without needing to edit foo_migrate.info again, and without needing to re-structure your directories. + +### Use the PSR-4 structure + +If you want to use the [PSR-4][4] model, you can do that too. + +In order to do so, you’ll need to complete the following steps: + +1. Rename the `includes` directory to `src`. +2. Ensure that there is one PHP class per file, and that the file ends with `.php` rather than `.inc`. +3. Ensure that the name of the file matches the name of the class - `FooArticleNodeMigration` would be in a file called `FooArticleNodeMigration.php`. +4. Add a namespace to each PHP file. This uses the same format as Drupal 8, including the machine name of the module. For example, `Drupal\foo_migrate`. + * If the class is within a sub-directory, then this will also need to be included within the namespace - e.g. `Drupal\foo_migrate\Node`. + * You’ll also need to import any class names that you are referencing, including class names that are you extending, by adding `use` statements at the top of the file. You may be able to prefix it with `\` instead (e.g. `\DrupalNode6Migration`), but I prefer to use imports. + +Now your class may look something like this: + +```php + 'Drupal\foo_migrate\Node\FooArticleNodeMigration', + 'source_type' => 'story', + 'destination_type' => 'article', +); +``` + +## Resources + +* [xautoload module][1] +* [migrate module][5] +* [migrate_d2d module][6] +* [PSR-0][3] +* [PSR-4][4] + +{% endblock %} + +[1]: https://www.drupal.org/project/xautoload +[2]: http://getcomposer.org +[3]: http://www.php-fig.org/psr/psr-0/ +[4]: http://www.php-fig.org/psr/psr-4/ +[5]: https://www.drupal.org/project/migrate +[6]: https://www.drupal.org/project/migrate_d2d