【问题标题】:Returning a redirect from a child function从子函数返回重定向
【发布时间】:2019-06-23 17:28:07
【问题描述】:

我正在做一个 Symfony 项目。它设置了自定义访问控制(动态创建并存储在数据库中)。因此,我创建了一个自定义 BaseController 类,它允许我执行单行调用来验证访问。这是其中的一些代码:

class BaseController extends AbstractController
{
    function prepare($customer, $product, $right) {
        // These are all defined in the class.  
        $this->loadCompany($customer);
        $this->canAccessProduct($product);
        $this->checkAccessRights($customer, $product, $right);
    }
}

prepare 方法在每个控制器的顶部调用。例如:

class IndexController extends BaseController {
   /**
     * @Route("/{customer}/download",
     *     name="download_home")
     */
    function customerIndex($customer)
    {
        $this->prepare($customer, "download", "read");
    }
}

现在我要进行更改:我想从路由中删除 {customer} 并将其作为“准备”函数调用的一部分加载。因此,我想将客户存储在会话变量中。如果未设置会话变量,我想重定向到不同的控制器。这是在 Symfony 中使用 return $this->redirectToRoute("app_company_select") 完成的。那么我可以将它设置为在$this->prepare() 中的返回调用,它也返回控制器函数吗?

我尝试了parent::return(),但这给出了一个未知的函数错误。还有其他方法可以做到这一点吗?

【问题讨论】:

  • 直接从prepare方法调用redirectToRoute有什么问题?
  • @slepic 很遗憾,这行不通。 redirectToRoute 需要从主控制器方法返回。否则 Symfony 不会进行重定向。
  • 澄清一下,你是说你的流程(如果没有设置会话变量)是 customerIndex --> 准备 --> getSession/Customer --> 准备东西 --> 在 customerIndex 中继续?还是 prepare() 函数会完全重定向到另一个逻辑分支?
  • 您需要通过链接return 从孩子返回重定向响应。或者,您可以返回一些带有 true 值的布尔标志,意思是“进行重定向”。或者,您可以将一些全局值设置为true(在服务意义上是全局的,例如,您可以在注入控制器的服务中设置一些标志,或者如果所有事情都发生在您的控制器中,您可以使用一些新的控制器字段) ,然后在控制器中检查该标志并返回重定向。控制器没有什么神奇之处,它们或多或少是普通的 PHP 函数,所以,所有常用方法都可以工作。
  • @ehymel 工作流程是 customerIndex-->preapre-->checkSession。如果 hasSessionVariable--> 准备东西并让控制器执行。否则重定向到客户选择器。

标签: php symfony symfony4


【解决方案1】:

然后,只需从您所在的位置直接重定向即可。只要您还没有发送任何标头,这应该可以正常工作。

public function prepare(...)
{
    $hasAccess = false
    // Check for access
    if(!$hasAccess){
        (new RedirectResponse('/go/somewhere'))->send();
        exit;
    }
}

【讨论】:

  • 正如我在 cmets 中所说,我希望避免触摸每个控制器来检查任何类型的标志。
  • 然后在检查中它自己只是发送重定向响应并退出
  • @MatthewB 我更新了我的答案以反映可能的解决方案。如果你想让 symfony 也为你生成路由,那么你可以将路由器注入到你用于检查的任何类中。
  • 这正是我所需要的,谢谢!它就像一个魅力。
猜你喜欢
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多