The RdnFactory ZF2 module makes it really easy to create factory classes.
-
Use
composer
to require theradnan/rdn-factory
package:$ composer require radnan/rdn-factory:1.*
-
Activate the module by including it in your
application.config.php
file:<?php return array( 'modules' => array( 'RdnFactory', // ... ), );
The module provides an RdnFactory\AbstractFactory
class that you should extend when creating your factory classes. Implement the protected create()
method to create your service.
namespace FooModule\Factory\Controller;
use FooModule\Controller;
use RdnFactory\AbstractFactory;
class Bar extends AbstractFactory
{
protected function create()
{
// Create and return your service
return new Controller\Bar;
}
}
This abstract factory has access to a repository of plugins, similar to a controller. Simply call the plugin as if you were calling a method:
namespace FooModule\Factory\Controller;
use FooModule\Controller;
use RdnFactory\AbstractFactory;
class Bar extends AbstractFactory
{
protected function create()
{
$config = $this->config('foo', 'bar');
$modules = $this->service('ModuleManager');
return new Controller\Bar($config, $modules);
}
}
Get configuration by key. You can pass multiple keys to traverse nested configuration items.
// grab the 'display_exceptions' item inside the 'view_manager' array
$config = $this->config('view_manager', 'display_exceptions');
Get the controller with the given name.
$controller = $this->controller('FooModule:BarController');
Get a form/fieldset/element with the given name.
$collection = $this->form('Collection');
$form = $this->form('FooModule:BarForm');
Get a route parameter value.
$id = $this->params('bar-id');
Get a service from the top-level service locator (service manager).
$app = $this->service('Application');
$view = $this->service('ViewRenderer');
$uploads = $this->service('RdnUpload\Container');
This is just a proxy to the url()->fromRoute()
controller plugin. Useful for generating URLs from within a factory.
$apiUrl = $this->url('foo/api/search/user');