I personally got tired of the multiple files that builds up when creating action factory files so I wrote a class called FactoryProvider.
namespace Core;
/**
* Class FactoryProvider
*
* @package Core
*/
abstract class FactoryProvider
{
/**
* @var array
*/
private $factories = [];
/**
* @return array
*/
public function __invoke()
{
$this->init();
return ['factories' => $this->factories];
}
/**
* @param string $class
* @param \Closure $closure
*/
protected function register(string $class, \Closure $closure)
{
$this->factories[$class] = $closure;
}
abstract public function init();
}
I use pimple as a container, but I’m sure this could work for practically any other container. Purpose of this just makes maintaining factories simpler for instance:
class FactoryProvider extends \Core\FactoryProvider
{
public function init()
{
$this->register(LoginAction::class, function(Container $container) {
$input = $container->has(Input::class) ? $container->get(Input::class) : null;
$router = $container->has(RouterInterface::class)
? $container->get(RouterInterface::class) : null;
$template = $container->has(TemplateRendererInterface::class)
? $container->get(TemplateRendererInterface::class) : null;
$entity_manager = $container->has(EntityManager::class)
? $container->get(EntityManager::class) : null;
$session = $container->has(Session::class)
? $container->get(Session::class) : null;
$user_login_service = new UserLoginService($input, $entity_manager, $session);
return new LoginAction($input, $router, $template, $user_login_service, $session);
});
}
}
Now not only in my user module can I keep track of all my user action factories in one file, but there aren’t 4 individual files that clogs up my folder.
Similar to ConfigProvider I just added it to the ConfigAggregator
, but I had to add my own check in the container.php file for it to actually register.
How do you feel if expressive implemented something like this in the core framework?