【问题标题】:How do I dynamically change a controller in Zend Framework?如何在 Zend Framework 中动态更改控制器?
【发布时间】:2009-11-19 12:22:03
【问题描述】:

我已经完成了一个 CMS,其中 URL 是基于页面标题的 SEO 友好名称。需要一个部分使用特定的控制器。比如:

test.com/page1(使用索引控制器) test.com/page2(使用索引控制器) test.com/page3(使用不同的控制器) test.com/page4(使用索引控制器)

我可以添加一条说“page3”将使用“不同”控制器的路由,但 CMS 的用户需要能够更改 URL 的名称和 seo,所以它目前在“page3”的位置以后可以更改,这会破坏我的路由规则。

获取请求并从数据库中提取要使用的控制器的最佳方式是什么(前端控制器插件或其他)(sql 类似于“SELECT controller FROM menu WHERE seo = 'page3'”),然后在 Zend 设置要使用的控制器之前将其设置为控制器?

非常感谢任何帮助或见解。

【问题讨论】:

    标签: php zend-framework controller


    【解决方案1】:

    您必须创建一个控制器插件并在请求对象上设置模块/控制器/操作。

    然后在 predispatch() 中你可以这样做:

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $request->setModuleName($this->_getModule());
        $request->setControllerName($this->_getController());
        $request->setActionName($this->_getAction());
    }
    

    然后您可以创建方法 __getModule()、_getController()、_getAction() 来检查 $_SERVER['REQUEST_URI'] 和您的数据库并设置适当的模块/控制器/操作。

    【讨论】:

    • 感谢您的回复。你提到的功能都应该是frontController插件的一部分吗?假设我制作了名为 updateControllerSeo 的插件,函数 preDispatch 和 _getController 将成为该类插件的一部分?再次感谢。
    • 是的。它们应该在插件中。但我建议将它们放在 routeShutdown() 中,因为在这种情况下,它们会在每个动作之前被调用(如果你使用动作视图 hleper 等等......)
    • 在插件中创建所有这些方法。如果它们不在您的插件类中,则不能使用 ($this) 调用它们。并且 preDispatch() 或 routeShutdown() 是必需的,因为它们是在调度周期中调用的“钩子”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多