Phalcon 3.4:在不使用调度程序事件的情况下在控制器操作中注入组件
Phalcon 3.4: Inject a component in a controller action without using dispatcher events
我正在尝试使用 laravel 方式在控制器操作中注入组件,请参阅 laravel 中的示例:
class UserController extends Controller {
/**
* Store a new user.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
他们使用一种叫做 "service container" 的东西来解析动作参数,这适用于 Phalcon 吗?
我确实尝试过手动制作,但没有成功!
我需要此功能以避免在 Phalcon DI 中将每个组件定义为服务。
我提出了 Phalcon 文档中描述的解决方案,但进行了一些调整以满足我的需求。
我提出的解决方案是向服务容器添加新的调度事件侦听器来处理操作依赖项,示例:
$di->setShared('dispatcher', function() {
$evManager->attach("dispatch:beforeDispatch", function (Event $event, Dispatcher $dispatcher) {
try {
$methodReflection = new ReflectionMethod(
$dispatcher->getControllerClass(),
$dispatcher->getActiveMethod()
);
foreach ($methodReflection->getParameters() as $parameter) {
$parameterClass = $parameter->getClass();
if ($parameterClass instanceof ReflectionClass) {
$dispatcher->setParam($parameter->name, new $parameterClass->name);
}
}
} catch (Exception $exception) {
throw new \Exception('', Dispatcher::EXCEPTION_HANDLER_NOT_FOUND);
}
});
$dispatcher = new Dispatcher();
$dispatcher->setEventsManager($evManager);
return $dispatcher;
}
每个框架都有自己的机制,所以如果你需要做一些特别的东西,你必须手动做。
我正在尝试使用 laravel 方式在控制器操作中注入组件,请参阅 laravel 中的示例:
class UserController extends Controller {
/**
* Store a new user.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
他们使用一种叫做 "service container" 的东西来解析动作参数,这适用于 Phalcon 吗?
我确实尝试过手动制作,但没有成功!
我需要此功能以避免在 Phalcon DI 中将每个组件定义为服务。
我提出了 Phalcon 文档中描述的解决方案,但进行了一些调整以满足我的需求。
我提出的解决方案是向服务容器添加新的调度事件侦听器来处理操作依赖项,示例:
$di->setShared('dispatcher', function() {
$evManager->attach("dispatch:beforeDispatch", function (Event $event, Dispatcher $dispatcher) {
try {
$methodReflection = new ReflectionMethod(
$dispatcher->getControllerClass(),
$dispatcher->getActiveMethod()
);
foreach ($methodReflection->getParameters() as $parameter) {
$parameterClass = $parameter->getClass();
if ($parameterClass instanceof ReflectionClass) {
$dispatcher->setParam($parameter->name, new $parameterClass->name);
}
}
} catch (Exception $exception) {
throw new \Exception('', Dispatcher::EXCEPTION_HANDLER_NOT_FOUND);
}
});
$dispatcher = new Dispatcher();
$dispatcher->setEventsManager($evManager);
return $dispatcher;
}
每个框架都有自己的机制,所以如果你需要做一些特别的东西,你必须手动做。