コントローラフォワーディングは素晴らしい機能であり、私はそれを使ってウィジェットの概念を作った。しかし、デフォルトでは非自己モジュールのコントローラをディスパッチできません。 (とも全くcontoller構成を避けるために)この問題を解決するために、私は、コントローラconstructonためabstaract_factory追加:Zend2 - 他のモジュールコントローラを転送するには?
namespace Engine\Mvc\Controller;
use Zend\ServiceManager\AbstractFactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class Autoloader implements AbstractFactoryInterface
{
public function canCreateServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName)
{
return true;
}
public function createServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName)
{
$class = ucfirst(str_replace('/', '\\', $requestedName)).'Controller';
if (!class_exists($class)){
return false;
}
return new $class;
}
}
/*In Module class*/
public function getControllerConfig()
{
return array(
'abstract_factories' => array(
'Engine\Mvc\Controller\Autoloader'
),
);
}
それは正常に動作します。ただし、コンストラクタ引数を持たない、呼び出し可能なコントローラのみ。私は私が(例えば作曲、一緒にインストールZfcUserを)変更することができないことを、モジュールからコントローラを埋め込むしようとする - それが失敗することがあり、theeseコントローラは非呼び出し可能なのinitを持つことができるので:
/*in zfc-user/module.config.php */
'controllers' => array(
'factories' => array(
'zfcuser' => 'ZfcUser\Factory\Controller\UserControllerFactory',
),
),
/*factory for controller*/
class UserControllerFactory implements FactoryInterface
{
/**
* Create controller
*
* @param ControllerManager $serviceLocator
* @return UserController
*/
public function createService(ServiceLocatorInterface $controllerManager)
{
/* @var ServiceLocatorInterface $serviceLocator */
$serviceLocator = $controllerManager->getServiceLocator();
$userService = $serviceLocator->get('zfcuser_user_service');
$registerForm = $serviceLocator->get('zfcuser_register_form');
$loginForm = $serviceLocator->get('zfcuser_login_form');
$options = $serviceLocator->get('zfcuser_module_options');
$controller = new UserController($userService, $options, $registerForm, $loginForm);
return $controller;
}
}
偏屈でmodule1UserControllerFactory
ZfcUserモジュールでは、私のabstract_factoryでコントローラを構築しようとしていて、UserControllerがすべての引数を必要とするため、エラーが発生します。
Zend\Mvc\Controller\Plugin\Service\ForwardFactory
をスワップすることで解決できる場合があります。「グローバル」の転送を構築する必要があるのはControllerManager
です。しかし、私は確信していません、 "グローバル" ControllerManager
はZend2に存在します。
質問:
- 私はServiceManagerからそれを得ることができる方法がグローバルControllerManager、ですか?
- コントローラー・プラグインを使用してディスパッチするその他の方法非自己モジュール・コントローラー(非自己モジュール・コントローラー構成によってコントローラーを構成しています)?
[リンク](http://stackoverflow.com/questions/14180839/is-it-possible-to-forward-data-to-another-controllerを参照してください。 -action-in-zend-2) –