Tuesday 5 January 2016

Zend Framework 2 Service Manager

Zend Framework 2 Service Manager

Question: What is Service Manager?
Service Manager is component which have lot of services and used to set/get the service on the requirement. It implemented on "Service Locator" design Pattern.


Question: What is Service Locator?
The Service Locator is a service/object locator, which are used to retrieving other objects.


Question: What is Service Locator Pattern?
Service Locator Pattern is a design Pattern which is used to locate various services. this design pattern used by "Service Locator Service" to get the appropriate service.


Question: What are Service Factories?
Instead of getting actual object instance or a class name, We can also the ServiceManager to invoke a provided factory to get the object instance.


Question: How to create Service Factories?Giv an Example?
You can also create your own serverice factory using Zend\ServiceManager\FactoryInterface and Zend\ServiceManager\ServiceLocatorInterface.
See Example
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class MyNewFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
  /** Return the data  

    Return the data **/  
       
    }
}

//Set the Factory
$serviceManager->setFactory('my-new-factory-name', new MyFactory()); 

//Get the Factory
$serviceManager->get('my-new-factory-name'));


Question: How to register an Object in Service manager?
$serviceManager->setService('new_obj_class1', new stdClass());
$serviceManager->setService('new_obj_class1'); // an instance of stdClass



Question: How to create aliases of any registered service?
$serviceManager->setService('my-object', $myObject);
$serviceManager->setAlias('my-alias1', 'my-object');
$serviceManager->setAlias('my-alias2', 'my-alias1')
/** my-object, my-alias1 and my-alias2 return same object **/



Question: What is use of setInvokableClass?
setInvokableClass allows you to tell the ServiceManager what class to instantiate when a particular service is requested.
$serviceManager->setInvokableClass('service-name', 'Fully\Qualified\ClassName');


Question: What is file location path Where we can set the configuration setting?
/module/module-name/config/module.config.php



Question: What are various service manager setting which we can set?
We can set abstract_factories, aliases,factories,invokables, services and shared.


Question: Give an example of service manager config?
return array(
    'service_manager' => array(
        'abstract_factories' => array(            
            'Module-Name\Service\FallbackFactory',
        ),
        'aliases' => array(            
            'SomeModule\Model\User' => 'User',            
            'AdminUser' => 'User',            
            'SuperUser' => 'AdminUser',
        ),
        'factories' => array(            
            'User'     => 'SomeModule\Service\UserFactory',
            'UserForm' => function ($serviceManager) {
            $formObject = new SomeModule\Form\User();
            $formObject->setInputFilter($serviceManager->get('UserInputFilter'));
            return $formObject;
            },
        ),
        'invokables' => array(
            'UserInputFilter' => 'SomeModule\InputFilter\User',
        ),
        'services' => array(
            // Auth is the service names
            // Values are objects
            'Auth' => new SomeModule\Authentication\AuthenticationService(),
        ),
        'shared' => array(            
            'UserForm' => false,
        ),
    ),
);