更新:在 Zend Framework 中管理静态内容的最佳实践?

Posted

技术标签:

【中文标题】更新:在 Zend Framework 中管理静态内容的最佳实践?【英文标题】:Updated: Best practices for managing static content in Zend Framework? 【发布时间】:2012-01-20 18:59:59 【问题描述】:

我有一些关于 Zend 框架的问题。我正在尝试使用现在默认的displayAction() 方法通过默认控制器路由所有静态页面。目的是让displayAction() 通过查看page 参数来处理请求,确定脚本页面是否存在,如果确实呈现视图,则抛出404 page not found 错误。此外,还会进行测试以查看是否存在与参数同名的方法,如果存在,则调用该操作。

这里列出的是来自 application.ini

的路由配置
resources.router.routes.static-pages.route = /:page
resources.router.routes.static-pages.defaults.module = default
resources.router.routes.static-pages.defaults.controller = index
resources.router.routes.static-pages.defaults.action = display

这里是控制器动作:

public function someAction() 
    // do something


public function displayAction()   
    // extract page param, e.g. 'some'      
    $page = $this->getRequest()->getParam('page');

    // create zend styled action method, e.g. 'someAction'
    $page_action = $page.'Action';

    // if a method within this controller exists, call on it
    if (method_exists($this, $page_action)) 
        $this->$page_action();
    

    // if nothing was passed in page param, set to 'home'
    if (empty($page)) 
        $page = 'home';
    

    // if script exists, render, otherwise, throw exception.
    if (file_exists($this->view->getScriptPath(null)."/".$this->getRequest()->getControllerName()."/$page.".$this->viewSuffix)) 
        $this->render($page);
     else 
        throw new Zend_Controller_Action_Exception('Page not found', 404);
    

现在,我的问题是:有更好的方法吗?我对这个框架比较陌生,所以有适用的最佳实践吗?有没有更好的方法从控制器中调用一个动作?我已经通过文档做了很多环顾四周,但是,其中很多似乎是自相矛盾的。

更新 1:

经过思考和阅读后,我设法简化了解决方案并包含了一些提到的内容。注意:我使用PagesController 作为我的默认静态内容控制器。

此处列出的是来自 application.ini 的路由配置。对于对主页的调用,即“/”,我将“home”作为action 参数传递,对于所有其他请求,用户定义的/url 链接参数在action 中发送。

resources.router.routes.home.route = "/"
resources.router.routes.home.defaults.module = "default"
resources.router.routes.home.defaults.controller = "pages"
resources.router.routes.home.defaults.action = "home"
resources.router.routes.pages.route = "/:action"
resources.router.routes.pages.defaults.module = "default"
resources.router.routes.pages.defaults.controller = "pages"

这里是控制器动作。如果用户定义的参数作为动作存在,就会被调用,否则就属于php魔术函数__call。

public function someAction()

    // Do something


public function __call($method, $args)

    // extract action param, e.g. "home"
    $page = $title = $this->getRequest()->getParam('action'); 

    // test if script exists
    if (file_exists($this->view->getScriptPath(null) . "/" 
        . $this->getRequest()->getControllerName() . "/$page . " . $this->viewSuffix)) 
   
        // pass title to layout
        $this->view->assign(compact('title'));
        // render script
        $this->render($page);
     else 
        throw new Zend_Controller_Action_Exception('Page not found', 404);
    

它有效。所以,我的问题是:你会考虑标准化使用这种方法来管理静态内容吗?如果不是,为什么不呢?你会如何改进它?另外,考虑到这是一个 GET 请求,使用 Zend_Filter_input 来清理输入是否是明智之举,还是只是矫枉过正?

【问题讨论】:

【参考方案1】:

你的方法在我看来是合理的。但是,也许您应该改用 __call 方法,这可以让您更轻松地路由您的操作...

这样设置你的路线:

resources.router.routes.static-pages.route = /:action
resources.router.routes.static-pages.defaults.module = default
resources.router.routes.static-pages.defaults.controller = index

你的控制器是这样的:

public function someAction() 
    //going to URL /some will now go into this method


public function __call($name, $args) 
    //all URLs which don't have a matching action method will go to this one

【讨论】:

感谢您的反馈,我一定会看看这个。【参考方案2】:

我认为你在正确的轨道上但是这里有一些其他的想法。

在 INI 中按部分分解路由: 即博客路由器、静态页面路由器、论坛路由器等。(我想你已经在这样做了)

使用各种路由器类来处理每个部分的路由,而不是将其发送到控制器。

静态: http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.static

全部: http://framework.zend.com/manual/en/zend.controller.router.html

一些可能有帮助的链接:

codeutopia.net/blog/2007/11/16/routing-and-complex-urls-in-zend-framework/ www.vayanis.com/2009/03/20/intro-to-zend-framework-routing/

【讨论】:

感谢您的反馈,正如您所说,为动态页面提供了替代的非静态路由。我会看一下文档,看看是否有什么可以用来改进设计的。

以上是关于更新:在 Zend Framework 中管理静态内容的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

为 Zend Framework 首页存储静态文本

Zend Framework 1 应用程序中的缓存破坏静态资产

如何在Zend Framework3中更新composer更新时集成simplesamlphp库和更新配置

Xcode7 制作通用的framework,静态库和动态库

Zend Framework 项目 index.php 的问题

markdown Zend Framework 3:Controller插件管理器