info.xml - Allow PSR-0 style class-loader declarations
authorTim Otten <totten@civicrm.org>
Mon, 22 Mar 2021 23:40:39 +0000 (16:40 -0700)
committerTim Otten <totten@civicrm.org>
Mon, 22 Mar 2021 23:58:10 +0000 (16:58 -0700)
commita76a800b427654def4d06d84dc2c35f05aff42c3
treefb5a04b16e0be4b9ecea8cad6aac674c2eb997fb
parenta876dc40d688d74448f4f52088357f43a59e0c8f
info.xml - Allow PSR-0 style class-loader declarations

Before
------

If an extension defines a class in the style of `CRM_Foo_Bar`, then it
*must* use `hook_civicrm_config` and modify the `include_path`.

```php
function mymod_civicrm_config(&$config = NULL) {
  $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
  $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
  set_include_path($include_path);
}
```

Consequently:

* The `include_path` gets rather long.
* Setting up the extension class-loader is not sufficient for loading these classes. You must
  wait until the DB has initialized and the `hook_civicrm_config` has fired.

After
-----

An extension *may* setup classloading in `info.xml`, e.g.

```xml
<classloader>
  <psr0 prefix="CRM_" path="" />
</classloader>
```

If the `<psr0>` style is used, then it is possible to scan the extension
classes without fully booting the extension.  This is a pre-requisite for
using interfaces, annotations, or similar for event-registration.

Comments
--------

* This style closely parallels the `<psr4>` support in `info.xml`, and it parallels the semantics of `composer.json`.
* It is still valid for an extension to set `include_path` -- that works the same as ever.
CRM/Extension/ClassLoader.php
CRM/Extension/Info.php
tests/phpunit/CRM/Extension/InfoTest.php