我使用symfony 6.1和PHP8.1.我想知道是否有一种方法可以让symfony控制器不返回任何内容.原因是我用的是Botman,不幸的是它自己给客户发了一个回复...因此,我需要让我的控制器不返回任何内容.

/**
 * @param Request $request
 *
 * @return Response
 */
#[Route('/botman', methods: 'POST')]
public function test(Request $request): Response
{
    DriverManager::loadDriver(WebDriver::class);
    $adapter = new FilesystemAdapter();

    $botman = BotManFactory::create([], new SymfonyCache($adapter), $request);

    $botman->hears('hello', static function (BotMan $bot) {
        $bot->reply('Yoooooo'); //<- Send a response to the client
    });

    $botman->fallback(static function (BotMan $bot) {
        $bot->reply('try again'); //<- Send a response to the client
    });

    $botman->listen(); // Launch the maching callback

    return new Response(); //Crash because a response have already been sent
}

这就是我在浏览器判断器上得到的信息.

{
    "status": 200,
    "messages": [
        {
            "type": "text",
            "text": "try again",
            "attachment": null,
            "additionalParameters": []
        }
    ]
}{
    "type": "https:\/\/tools.ietf.org\/html\/rfc2616#section-10",
    "title": "An error occurred",
    "status": 500,
    "detail": "Warning: Cannot modify header information - headers already sent by (output started at C:\\Users\\cimba\\Documents\\botman\\vendor\\symfony\\http-foundation\\Response.php:1265)",
    "class": "ErrorException",
    "trace": [...]
}

我唯一的解决方案是exit();die();,而不是return,但我认为它不适合生产…也许有一种方法可以避免Botman发送它的响应,或者告诉symfony我希望我的控制器不返回任何东西(因为Botman没有symfony).

推荐答案

我自己还没有用过Botman,所以这只是个猜测.您可能会try 查看是否存在Botman包,因为我怀疑如果存在这样的包,那么它将处理这类事情,并消除使用静态工厂方法的需要.

然而,返回空响应(这意味着没有标头或内容)也可能会起到作用.

# src/Http/EmptyResponse.php
namespace App\Http;

use Symfony\Component\HttpFoundation\Response;

class EmptyResponse extends Response
{
    public function send(): static
    {
        // Skip sending headers and content
        // $this->sendHeaders();
        // $this->sendContent();

        // Keep some standard Symfony magic
        if (\function_exists('fastcgi_finish_request')) {
            fastcgi_finish_request();
        } elseif (\function_exists('litespeed_finish_request')) {
            litespeed_finish_request();
        } elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) {
            static::closeOutputBuffers(0, true);
        }

        return $this;
    }
}

然后你的控制器里只有return new EmptyResponse();个.

我在一个常规的控制器动作中测试了这一点,Symfony没有抱怨.但我再一次没有Botman设置来测试.好奇地想看看它是否有效.

Php相关问答推荐

产品ACF值在WooCommerce我的账户订单的附加列中为空

过滤WooCommerce管理员订单列表(+HPOS)中包含其作者产品的订单

PHP日期操作,将多个日期输出为格式化字符串

在内部API请求之后,在响应客户端之前,是否忘记了PHP中的Header()?

Mod_重写子目录中相应的php文件

这是在可召回的背景下吗?

设置WordPress最近的帖子小部件按修改日期排序

基于服务器的不同地平线配置

表单提交返回空白页

如何从phpseclib和SFTP获取日志(log)记录?

如何在codeigniter中将order_by RAND与下面的代码一起使用

Woocommerce 仅在前端为登录用户提供价格折扣

WooCommerce 中一件免费产品的数量折扣

使用 wp_footer 挂钩添加一些 CSS 不起作用

将产品数量、名称和结帐链接添加到 WooCommerce 添加到购物车消息

Laravel Eloquent:复杂的多对多关系以及缺失关系的默认值

WooCommerce 订单和邮箱通知的自定义产品描述

如何在PHP中对多个脚本调用进行排队?

按前 3 列对二维数组中的行数据进行分组,然后用逗号连接每组中的其余列

使用php删除数组中相同数字的所有变体