Hi, 

When I use the a the plugin manager i noticed something regarding the creation 
options.

The plugin manager can be used to pass creation options while getting a service.

$service = $pm->get(’service’, array(...));

However I am confused about the indented behavior of this feature. Looking at 
the code of createFromInvokable and createFromFactory these options are passed 
to the constructors of the invokable and the factory. Thus not constantly to 
the constructor of the service i am trying to retrieve.

This difference isn’t noticeable until you use 'not shared' services and 
factories together.

call this the first time; 
$plgman->get(’service’, array(’some_option’=>1));
1. factory is created, createOptions are passed to __construct of factory
2. service instance is created, factory may do something useful with 
createOptions.

call this the first time and some_option is still 1.
$plgman->get(’service’, array(’some_option’=>2));
1. factory already exists, createOptions are not passed to factory
2. service instance is created, factory may do something useful with incorrect 
createOptions.

I am not sure if this is intended or not, but this makes more sense to me;

$instance = $this->createServiceViaCallback(array($factory, 'createService'), 
$canonicalName, $requestedName, $this->creationOptions);

where the createService method may pass the creationOptions to the actual 
service being created.


Thank you

Bas Kamer


from AbstractPluginManager

    protected function createFromInvokable($canonicalName, $requestedName)
    {
        $invokable = $this->invokableClasses[$canonicalName];

        if (null === $this->creationOptions
            || (is_array($this->creationOptions) && 
empty($this->creationOptions))
        ) {
            $instance = new $invokable();
        } else {
            $instance = new $invokable($this->creationOptions);
        }

        return $instance;
    }


protected function createFromFactory($canonicalName, $requestedName)
    {
        $factory            = $this->factories[$canonicalName];
        $hasCreationOptions = !(null === $this->creationOptions || 
(is_array($this->creationOptions) && empty($this->creationOptions)));

        if (is_string($factory) && class_exists($factory, true)) {
            if (!$hasCreationOptions) {
                $factory = new $factory();
            } else {
                $factory = new $factory($this->creationOptions);
            }

            $this->factories[$canonicalName] = $factory;
        }

        if ($factory instanceof FactoryInterface) {
            $instance = $this->createServiceViaCallback(array($factory, 
'createService'), $canonicalName, $requestedName);
        } elseif (is_callable($factory)) {
            $instance = $this->createServiceViaCallback($factory, 
$canonicalName, $requestedName);
        } else {
            throw new Exception\ServiceNotCreatedException(sprintf(
                'While attempting to create %s%s an invalid factory was 
registered for this instance type.', $canonicalName, ($requestedName ? '(alias: 
' . $requestedName . ')' : '')
            ));
        }

        return $instance;
    }
--
List: [email protected]
Info: http://framework.zend.com/archives
Unsubscribe: [email protected]


Reply via email to