Consuming Resources¶
Resource consumers are packages that load resources of a specific type or
format from other packages. Imagine a translation package that contains a
Translator
class. Translations used by the Translator
can be provided
by other packages, the resource providers, in the form of *.yml
files.
Puli supplies the infrastructure to connect resource consumers with their
providers. The consumer defines a binding type for the type of resource it is
interested in. The provider binds resources to this binding type. At last, the
consumer is able to load all bound resources through Puli’s
ResourceDiscovery
.
Defining a Binding Type¶
A binding type can be defined with the type --define
command of the Puli
CLI:
$ php puli.phar type --define thor/translations
This command adds the new binding type to the puli.json
file of your
package.
Note
The name of a binding type must always start with the vendor name of your Composer package. This prevents naming collisions and makes sure that you own the type.
You should publish the name of your binding type in your documentation so that resource providers for your package know which type to use.
Listing Binding Types¶
You can list all defined binding types with the type
command:
$ php puli.phar type
The following binding types are currently enabled:
Package: thor/translator
Type Description Parameters
thor/translations
Type Descriptions¶
You should add a short description for your binding type that explains what kind
of resource the binding type expects to be bound to. A description can be set
with the --description
option when adding the type:
$ php puli.phar type --define thor/translations \
--description "A Yaml file with translations for the Translator class."
The description is shown in the output of the type
command:
$ php puli.phar type
The following binding types are currently enabled:
Package: thor/translator
Type Description Parameters
thor/translations A Yaml file with translations for the
Translator class.
Changing a Binding Type¶
Binding types can be changed with the type -u
(or --update
) command. The
command takes the name of the binding type as argument and one or more options
for the value that you want to change:
$ php puli.phar type -u thor/translations \
--description "A Yaml file with translations for the Translator class."
Call type -h
to learn about the different options supported by the -u
command:
$ php puli.phar type -h
Deleting a Binding Type¶
Binding types can be removed with the type -d
(or --delete
) command:
$ php puli.phar type -d thor/translations
This command will remove the given binding type from your puli.json
. Note
that you can only remove binding types defined in your own package. If you try
to remove a binding type defined by a different package installed through
Composer, the type -d
command will fail.
Loading Bound Resources¶
You can load the bindings for your binding type with the
findByType()
method of the
ResourceDiscovery
. Pass the name of your binding
Type as first and only argument:
$bindings = $discovery->findByType('thor/translations');
The method returns an array of ResourceBinding
instances. With getResources()
,
you can load the resources matched by the binding:
foreach ($bindings as $binding) {
foreach ($binding->getResources() as $resource) {
// do something with $resource...
}
}
Loading Bindings for a Resource¶
You can load the bindings for a specific resource with the
findByPath()
method. This
method accepts a Puli path as first argument:
$bindings = $discovery->findByPath('/batman/blog/trans/messages.en.yml');
If you are only interested in bindings of one binding type, pass the name of the binding type as second argument:
$bindings = $discovery->findByPath('/batman/blog/trans/messages.en.yml', 'thor/translations');
Binding Parameters¶
You can define custom parameters for a binding type. These parameters can be used to store additional data with a binding. For example, consider that the name of the translation catalog (here: “messages”) is not taken from the file name, but from the binding parameter “catalog”.
You can add the parameter with the --param
option when defining the binding
type:
$ php puli.phar type --define thor/translations --param catalog
Each binding must now specify a value for this parameter:
$ php puli.phar bind /batman/blog/trans/messages.*.yml --param catalog="blog"
Use getParameterValue()
on the
ResourceBinding
to check the value of your
parameter:
$bindings = $discovery->findByType('thor/translations');
foreach ($bindings as $binding) {
if ('blog' === $binding->getParameterValue('catalog')) {
// do something with $binding...
}
}
Optional Parameters¶
Often it makes sense to define a default value for a binding parameter. You can
set a default value by setting the --param
option in the form
<param>="<default>"
:
$ php puli.phar type --define thor/translations --param catalog="messages"
Note
The quotes (”) are optional if the parameter value does not contain spaces.
Binding parameters with a default value are optional. If no parameter value is set for a binding, the default value is used.