3

我正在尝试构建一个 Symfony 4.3.3 命令,我想在其中添加随时覆盖回调函数的能力。看下面的代码片段:

namespace App\Command;

use Swoole\Http\Request;
use Swoole\Http\Response;
use Swoole\WebSocket\Server;

final class SwooleWsCommand extends Command
{
    // ...

    protected function execute(InputInterface $input, OutputInterface $output): bool
    {
        $port   = $input->getArgument('port');
        $server = new SwooleServer("127.0.0.1", (int)$port);
        $server->on('request', static function (Request $request, Response $response) {
            $response->end('Hello '.$request->rawcontent());
        });
        $server->start();
        return true;
    }
}

我想转换这个:

$server->on('request', static function (Request $request, Response $response) {
    $response->end('Hello '.$request->rawcontent());
});

进入这个(如果可能的话,这不是一件疯狂的事情或不可能实现):

$server->on('request', <function>);

我的想法(我可能完全错误)是创建一个允许随时覆盖方法的接口。下面是它的代码片段:

namespace App\Service;

use Swoole\Http\Request;
use Swoole\Http\Response;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;

interface SwooleWsCallbackInterface
{
    public function request(Request $request, Response $response): void;
    public function message(Server $server, Frame $frame): void;
}

从那里我应该能够在命令中注入接口,例如:

/** @var SwooleWsCallbackInterface */
private $callback;

public function __construct(SwooleWsCallbackInterface $callback)
{
    $this->callback = $callback;
    parent::__construct();
}

您可能会注意到该函数request()接收两个参数。出于这样的原因,一旦我从命令中调用该方法,因为$server->on('request', $this->callback->request($request, $response));它试图访问这两个参数。

我已阅读 Symfony Docs for How to Autowire Interfaces,但我仍然不清楚如何正确设置该方法工作所需的参数。

如果我在这里正确理解文档:

 App\Util\TransformerInterface: '@App\Util\Rot13Transformer'

他们已经覆盖了 at 的方法,App\Util\Rot13Transformer应该没有任何问题。但是,该示例未显示来自被调用transform接口的方法。TransformerInterface

不确定我的场景中正确的自动装配是否是:

  App\Command\SwooleWsCommand: ~
  sdk.command.swoolews:
    alias: App\Command\SwooleWsCommand

  App\Service\SwooleWsCallbackInterface: ~
  sdk.swoolews:
    alias: App\Service\SwooleWsCallbackInterface

我可以在这里得到一些关于如何实现这一目标的想法吗?以及它是如何工作的一些解释?我可能弄错了:|

注意:如果有什么不清楚或令人困惑,请问我

4

2 回答 2

1

您正在调用要传递对函数的引用的函数。尝试这个:

$server->on('request', function ($request, $response) {
$this->callback->request($request, $response);
});
于 2019-08-14T19:51:50.177 回答
1

您仍然想创建一个闭包以传递给$server->on. 您可以这样做:

$onRequest = Closure::fromCallable([$this->callback, 'request']);

然后通过它:

$server->on('request', $onRequest);
于 2019-08-14T19:43:12.870 回答