Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从zend expressive REST api应用程序中调用另一个内部端点?_Php_Rest_Mezzio_Psr 7 - Fatal编程技术网

Php 如何从zend expressive REST api应用程序中调用另一个内部端点?

Php 如何从zend expressive REST api应用程序中调用另一个内部端点?,php,rest,mezzio,psr-7,Php,Rest,Mezzio,Psr 7,我试图从zend expressive(PSR-7)应用程序中的另一个方法中调用RESTAPI端点(内部)。目前我正在做的是,我发送另一个http请求,如下(): 但我想知道,既然我试图调用一个内部端点,我是否能够以某种方式转发请求?我听说过控制器插件,但我不确定它是如何工作的 从数据库检索端点url和请求类型。我可以直接调用该方法,但转发端点将减少有条件地检查每个模块所需的工作量 如果你能为我指出正确的方向,我将不胜感激 更新: 让我解释一下用例。我们有一个调度程序数据库,其中包含要发送的端点

我试图从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;
    }