Php 如何从zend expressive REST api应用程序中调用另一个内部端点?
我试图从zend expressive(PSR-7)应用程序中的另一个方法中调用RESTAPI端点(内部)。目前我正在做的是,我发送另一个http请求,如下(): 但我想知道,既然我试图调用一个内部端点,我是否能够以某种方式转发请求?我听说过控制器插件,但我不确定它是如何工作的 从数据库检索端点url和请求类型。我可以直接调用该方法,但转发端点将减少有条件地检查每个模块所需的工作量 如果你能为我指出正确的方向,我将不胜感激 更新:Php 如何从zend expressive REST api应用程序中调用另一个内部端点?,php,rest,mezzio,psr-7,Php,Rest,Mezzio,Psr 7,我试图从zend expressive(PSR-7)应用程序中的另一个方法中调用RESTAPI端点(内部)。目前我正在做的是,我发送另一个http请求,如下(): 但我想知道,既然我试图调用一个内部端点,我是否能够以某种方式转发请求?我听说过控制器插件,但我不确定它是如何工作的 从数据库检索端点url和请求类型。我可以直接调用该方法,但转发端点将减少有条件地检查每个模块所需的工作量 如果你能为我指出正确的方向,我将不胜感激 更新: 让我解释一下用例。我们有一个调度程序数据库,其中包含要发送的端点
让我解释一下用例。我们有一个调度程序数据库,其中包含要发送的端点和参数。每5分钟向调度程序API发送一次cURL请求(CRON)。调度器检查数据库中提供的间隔,并在此间隔触发相应的端点。我想到的第一个方法是将当前类(可能是RequestHandleInterface的实现)转换为中间件(MiddlewareInterface)并更改路由定义。您将使用[Middleware::class,RequestHandler::class](例如[EditEntityMiddleware::class,GetEntityHandler::class]),而不是RequestHandler::class。如果需要将信息从中间件传递到处理程序,只需将其添加到请求中:
return $handler->handle($request->withAttribute('newInfo' => $newInfo));
要访问请求处理程序中的信息,请执行以下操作:
$newInfo = $request->getAttribute('newInfo');
此API的响应速度应该快得多,但是如果有很多端点,则可能很难添加/编辑很多路由
如果你给我们一个更具结论性的例子,我们可能会得到更好的答案。
我在编辑实体时遇到了相同的情况,因为我必须对数据库进行更改并返回新实体。对于EditHandler,我只是扩展了GetEntityHandler(“handle”方法)。我首先更新了数据库实体,然后简单地调用returnparent::handle($request),它返回新的数据库实体 因此,如果我理解正确,您的API将接收一组命令和每个命令的一组参数。我将为每个命令创建一个单独的类,以及一个包含映射的类,您可以将其视为工厂 API: CommandsMappingClass:
private const MAPPING = [
'command1' => Command1::class,
];
public static function getClassForCommand(string $commandName): ?string
{
//you can return a default command if you need to
return self::MAPPING[$commandName] ?? null;
}
这是一个初步的解决办法。映射可以看作是一个动态注册表,应用程序的每个模块都可以向其中添加cron作业命令(当然,这些命令不会存储在常量中)。看
public function handle(ServerRequestInterface $request): ResponseInterface
{
$parameters = $request->getAttribute('parameters');
foreach($request->getAttribute('commands') as $commandName){
$commandClass = CommandsMappingClass::getClassForCommand($commandName);
//you can save the response if you need to
(new $commandClass())->__invoke($parameters[$commandName]);
}
}
private const MAPPING = [
'command1' => Command1::class,
];
public static function getClassForCommand(string $commandName): ?string
{
//you can return a default command if you need to
return self::MAPPING[$commandName] ?? null;
}