如何在Symfony2或Symfony3中检查请求是POST请求还是GET请求

51
我想知道是否有一种非常简单的方法(最好是一个简单的$this->container->isGet()),可以确定请求是$_POST请求还是$_GET请求。 根据文档,

Request对象保存了有关客户端请求的信息。此信息可通过几个公共属性访问:

  • request: 相当于$_POST
  • query: 相当于$_GET ($request->query->get('name'));
但我不能使用if($request->request)if($request->query)来检查,因为这两个都是Request类中已有的属性。 所以我想知道Symfony是否提供类似于
$this->container->isGet();
// or isQuery() or isPost() or isRequest();

上面提到的?


1
你可以像这样使用 $request->get('name'),无论请求方法是 POST 还是 GET。如果你真的想确定请求方法,你可以添加一个 "requirements: [_method: POST/GET/DELETE....]"。 - Leo Silence
你的意思是将这行代码添加到路由配置中吗?我已经在那里检查了限制方法,现在我想在控制器中确定它们。 - Gottlieb Notschnabel
如果您在路由中检查了限制方法,那么在控制器中只需使用 $request->get('name') 即可。 - Leo Silence
我正在使用一个控制器来处理两种方法,例如在表单中(您可以使用$form->isSubmitted()来检查此内容)。但在我的情况下,我没有/不使用表单。 - Gottlieb Notschnabel
6个回答

85

如果您想在控制器中执行此操作,

$this->getRequest()->isMethod('GET');

或者在你的模型(服务)中,首先将请求对象注入或传递到你的模型中,然后像上面那样执行相同的操作。

编辑:对于Symfony 3,请使用此代码

if ($request->isMethod('post')) {
    // your code
}

1
谢谢,我也在这里找到了答案:https://dev59.com/Fmw15IYBdhLWcg3wQ5li#6723808 - Gottlieb Notschnabel
4
正如MHakvoort在他的答案中提到的,$this->getRequest()自Symfony 2.4起已被弃用。 - Chris

46

或者这样:

public function myAction(Request $request)
{
    if ($request->isMethod('POST')) {

    }
}

2
已更新问题名称,这样大家搜索时就可以找到它了。 - timhc22

6
或者这个:
use Symfony\Component\HttpFoundation\Request;

$request = Request::createFromGlobals();

    if ($request->getMethod() === 'POST' ) {
}

这对于Slim框架来说可能是可以的,但Symfony最佳实践是使用依赖注入。不过,你的解决方案在Symfony 5中仍然有效。 - Robert Saylor
这位救星太棒了!它在Symfony 6.1中也能正常工作。 - wui

4

由于建议使用现在已经弃用的getRequest(),您可以通过以下方式实现:

$this->get('request')->getMethod() == 'POST'

7
这也已经被弃用了。在控制器中,你应该只使用类型提示的 $request 对象。例如,$request->getMethod() == 'POST'。 - Tomas Vysniauskas

2
此外 - 如果您更喜欢使用常量:
if ($request->isMethod(Request::METHOD_POST)) {}

请查看Request类:

namespace Symfony\Component\HttpFoundation;

class Request
{
    public const METHOD_HEAD = 'HEAD';
    public const METHOD_GET = 'GET';
    public const METHOD_POST = 'POST';
    public const METHOD_PUT = 'PUT';
    public const METHOD_PATCH = 'PATCH';
    public const METHOD_DELETE = 'DELETE';

0

你可以这样做:

if($this->request->getRealMethod() == 'post') {
    // is post
}

if($this->request->getRealMethod() == 'get') {
    // is get
}

刚在Symfony API页面上了解了一下request对象的相关内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接