如何在 Symfony 4.3.x 方法需要参数时正确自动连接接口?
How to properly auto wire an Interface in Symfony 4.3.x when the method requires parameters?
我正在尝试构建一个 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));
命令中调用该方法,它就会尝试访问这两个参数。
我已经阅读了 How to Autowire Interfaces 的 Symfony 文档,但我仍然不清楚如何正确设置方法工作所需的参数。
如果我在这里正确理解文档:
App\Util\TransformerInterface: '@App\Util\Rot13Transformer'
他们已经覆盖了 App\Util\Rot13Transformer
中的方法,应该不会有任何问题。但是,该示例未显示正在调用的接口 TransformerInterface
中的方法 transform
。
不确定在我的场景中正确的自动装配是否是:
App\Command\SwooleWsCommand: ~
sdk.command.swoolews:
alias: App\Command\SwooleWsCommand
App\Service\SwooleWsCallbackInterface: ~
sdk.swoolews:
alias: App\Service\SwooleWsCallbackInterface
我可以在这里得到一些关于如何实现这一点的想法吗?以及它如何工作的一些解释?我可能弄错了:|
Note: if something is not clear or it's confusing just ask me
您仍想创建一个闭包以传递给 $server->on
。您可以这样做:
$onRequest = Closure::fromCallable([$this->callback, 'request']);
然后传过去:
$server->on('request', $onRequest);
您正在调用您想要传递对函数的引用的函数。试试这个:
$server->on('request', function ($request, $response) {
$this->callback->request($request, $response);
});
我正在尝试构建一个 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));
命令中调用该方法,它就会尝试访问这两个参数。
我已经阅读了 How to Autowire Interfaces 的 Symfony 文档,但我仍然不清楚如何正确设置方法工作所需的参数。
如果我在这里正确理解文档:
App\Util\TransformerInterface: '@App\Util\Rot13Transformer'
他们已经覆盖了 App\Util\Rot13Transformer
中的方法,应该不会有任何问题。但是,该示例未显示正在调用的接口 TransformerInterface
中的方法 transform
。
不确定在我的场景中正确的自动装配是否是:
App\Command\SwooleWsCommand: ~
sdk.command.swoolews:
alias: App\Command\SwooleWsCommand
App\Service\SwooleWsCallbackInterface: ~
sdk.swoolews:
alias: App\Service\SwooleWsCallbackInterface
我可以在这里得到一些关于如何实现这一点的想法吗?以及它如何工作的一些解释?我可能弄错了:|
Note: if something is not clear or it's confusing just ask me
您仍想创建一个闭包以传递给 $server->on
。您可以这样做:
$onRequest = Closure::fromCallable([$this->callback, 'request']);
然后传过去:
$server->on('request', $onRequest);
您正在调用您想要传递对函数的引用的函数。试试这个:
$server->on('request', function ($request, $response) {
$this->callback->request($request, $response);
});