Model view controller Symfony,仅可通过转发访问操作

Model view controller Symfony,仅可通过转发访问操作,model-view-controller,symfony1,Model View Controller,Symfony1,是否可以阻止直接访问symfony中的操作。只有“前进”才能访问该操作。因此,基本上是一种查看请求是否来自另一个操作的方法 我正试图实现这一点,因为第一个操作会处理大量验证,如果失败,它将继续执行该操作。如果成功,它将采取适当行动;此操作需要有安全输入(从第一个操作开始验证)。为了保持代码干燥,第二个操作不需要再次重新验证所有输入 那么为什么不简单地使用私有方法呢?第二个动作有点像一个插件,它是由第一个动作决定的,这个动作有它自己的一套未来动作/模板。更合理的做法是直接转发,而不是试图处理Sym

是否可以阻止直接访问symfony中的操作。只有“前进”才能访问该操作。因此,基本上是一种查看请求是否来自另一个操作的方法

我正试图实现这一点,因为第一个操作会处理大量验证,如果失败,它将继续执行该操作。如果成功,它将采取适当行动;此操作需要有安全输入(从第一个操作开始验证)。为了保持代码干燥,第二个操作不需要再次重新验证所有输入


那么为什么不简单地使用私有方法呢?第二个动作有点像一个插件,它是由第一个动作决定的,这个动作有它自己的一套未来动作/模板。更合理的做法是直接转发,而不是试图处理Symfony已经处理的大量案例。

使用请求中可用的referer参数


$request->getReferer()将为您提供以前操作的完整url

有多种方法可以实现此目的

1) 确保路由无法访问您的操作。如果您有通配符路由,这将更加困难,但您始终可以添加一个路由,将您的操作的url指向404页面。将类似的内容添加到您的
路由.yml

disabled_action:
  url: /disabledController/disabledAction
  params: { module: default, action: error404 }

2) 在执行操作时检查操作堆栈。动作堆栈让您知道您是从哪个动作重定向的。您可以使用
$this->getController()->getActionStack()
在操作中访问它。如果
getSize()
大于
1
(在默认配置中),我们将转发给您。

我很好奇您为什么要尝试实现这一点。您是否希望有多个访问点来执行此操作?如果您只是定义了一个私有方法(默认情况下是不可通过web访问的)并直接从另一个操作调用它会怎么样?

您能否更详细地解释一下您希望通过该方法实现什么。为什么要转发一个不可访问的操作对我来说没有意义,但也许我到目前为止还没有发现任何用例。我在问题中添加了一个解释。不过已经有人回答了。谢谢,我认为你的“第二个控制器”应该是一项服务,也许你以后应该试试。。。如果需要,您可以将模板服务注入到自己的服务中。
$request->getReferer()
从HTTP请求返回REFERER头。无法“信任”此标头,因为并非所有浏览器都发送此标头(您可以配置浏览器不发送此标头),而且还可以轻松进行欺骗。此解决方案非常完美。你提出的两种方法都很有效。谢谢你花时间回答这个问题,而不是问我为什么这样做。我在问题中添加了一个解释。不过已经有人回答了。谢谢