私は別のサービスを使用し、それをコントローラに注入します。
interface UserWidgetServiceInterface
{
public function __construct(array $widgets);
public function getWidget($name);
}
そしてコントローラ工場
class MyControllerFactory
{
public function __invoke(ControllerManager $controllerManager, $name, $requestedName)
{
$serviceLocator = $controllerManager->getServiceLocator();
$userWidgetService = $serviceLocator->get('UserWidgetService');
return new MyController($userWidgetService);
}
}
ウィジェットをロードするためのロジックはUserWidgetServiceFactory
に移動されるであろう。
public function UserWidgetServiceFactory
{
public function __invoke(ServiceManager $serviceLocator, $name, $requestedName)
{
$userId = 123; // Load from somewhere e.g session, auth service.
$widgetNames = $this->getWidgetNames($serviceLocator, $userId);
$widgets = $this->loadWidgets($serviceManager, $widgetNames);
return new UserWidgetService($widgets);
}
public function getWidgetNames(ServiceManager $sm, $userId)
{
return ['foo','bar'];
}
public function loadWidgets(serviceManager $sm, array $widgets)
{
$w = [];
foreach($widgets as $widgetName) {
$w[$widgetName] = $sm->get($widgetName);
}
return $w;
}
}
loadWidgets()
を呼び出すと、すべてのウィジェットが読み込まれます。これを最適化したい場合は、ウィジェットを登録することができます。LazyServices