【问题标题】:Action -methods vs public methods in PHP frameworksPHP 框架中的 Action 方法与公共方法
【发布时间】:2011-02-09 08:30:46
【问题描述】:

你们都知道有很多 PHP 框架,我对你们的想法很感兴趣:Zend 框架有所谓的动作控制器,它必须包含至少一个动作方法,该方法的名称以“行动”。例如:

public function indexAction() {}

“Action”这个词很重要,没有它你就不能通过 URI 直接访问方法。然而,在其他一些框架(如 Kohana)中,您有公共和私有方法,其中公共方法可访问而私有方法不可访问。所以我的问题是你认为哪种方法更好?从安全的角度来看,我会投票给 Zend 的方法,但我有兴趣了解其他人的想法。

【问题讨论】:

    标签: php model-view-controller zend-framework public-method


    【解决方案1】:

    根据偏好,我很喜欢 zend 框架的方法。它具有适当的控制器封装。是的,您必须添加单词 action 并创建一个视图脚本(可选),以便您通过 URL 访问它。然而,您仍然可以使用控制器中的私有、受保护和公共功能来实现额外的逻辑。

    【讨论】:

      【解决方案2】:

      真的是偏爱。使用某种命名约定更加通用(这实际上是 Kohana 3 现在所做的),因为它允许不是操作的公共方法,这可能很有用。

      当然,理想的解决方案是使用某种代码元数据,如.NET's attributesJava's annotations,但不幸的是,PHP 中不存在此功能。

      【讨论】:

        【解决方案3】:

        这与安全性的关系不如 ZF 的设计。正如您所说,通过 URL 调用时无法访问这些方法,但这完全取决于 Zend Framework 处理请求的方式。

        引用reference guide

        Zend_Controller 的工作流程比较简单。 Zend_Controller_Front 收到一个请求,然后调用 Zend_Controller_Router_Rewrite 来确定要分派哪个控制器(以及该控制器中的操作)。

        Zend_Controller_Router_Rewrite 分解 URI 以便在请求中设置控制器和操作名称。 Zend_Controller_Front 然后进入一个调度循环。它调用Zend_Controller_Dispatcher_Standard,将请求传递给它,以分派到请求中指定的控制器和操作(或使用默认值)。

        方法名被格式化为Zend_Controller_Dispatcher_Abstract:

        /**
         * Formats a string into an action name.  This is used to take a raw
         * action name, such as one that would be stored inside a Zend_Controller_Request_Abstract
         * object, and reformat into a proper method name that would be found
         * inside a class extending Zend_Controller_Action.
         *
         * @param string $unformatted
         * @return string
         */
        public function formatActionName($unformatted)
        {
            $formatted = $this->_formatName($unformatted, true);
            return strtolower(substr($formatted, 0, 1)) . substr($formatted, 1) . 'Action';
        }
        

        Action 后缀是硬编码的,所以不管是什么,Dispatcher 总是会寻找一个 Action 方法。因此,当您请求 /user/show/ 时,由于请求的处理方式,您会调用 UserController::showAction()。但它不是安全功能,也不是可见性的替代品。使showAction() 受保护,您也无法再通过 URL 访问它。从技术上讲,如果您也不通过常规设置运行非操作方法,则可以从 URI 中调用它们。您可以创建自己的 Dispatcher 并轻松更改 ZF 格式化动作名称的方式。

        Action Suffix 的好处是,它使操作方法与控制器中的其他方法明显区分开来。

        【讨论】:

        • 在 Kohana 中,控制器中的所有方法都可以通过 URI 访问,除非您提供 private/protected 关键字。我可以想象许多开发人员忘记在某些方法中设置私有/受保护,这会导致漏洞。在 Zend Framework 中,这不会发生,因为您必须明确定义哪些方法可以通过带有后缀“Action”的 URI 访问。
        • @Tower 可能,但正如我在上面所说和显示的:必须编写 Action 后缀不是 security 概念,而是设计概念。它不是可见性关键字的替代品。这只是一个代码约定。
        • 同意 Gordon - 这不是安全问题。如果您想浏览折叠到方法级别的源代码,使用“Action”尤其会更清楚 - 那么“Action”这个词往往会比公共/私有更突出
        【解决方案4】:

        Zend 有这个,因为在 PHP 4 中你没有私有/公共,所以他们不得不依赖命名约定。确实同时具有公共/私有和命名约定更安全。

        【讨论】:

        • 等一下,我 ZF从未 研究过 PHP4,它是专为 PHP5+ 设计的。
        • ZF 专为 PHP5 设计。
        • 您的权利。我想知道他们为什么选择使用这种命名方案,而不是,可能只是为了便于理解。
        【解决方案5】:

        我会说这取决于个人喜好。这里有很多变体,例如 codeigniter 的版本是任何以 _ 开头的方法名称都是私有的,其他任何东西都是控制器方法。

        就个人而言,我想说任何使用内置语言控件(例如public function vs private function)的东西都是最直观的。

        编辑:正如 frank 所说,最安全的方法是使用尽可能多的功能(例如 private 以及方法名称)。

        【讨论】:

        • 在非公共方法名称前添加下划线是 PHP4 时代的遗留物,您可以通过它指示建议的可见性(而不是它会产生任何影响)。 ZF 也按惯例使用这种表示法(尽管它不向后兼容 PHP4),可能是为了让代码中的可见性更容易被发现。不过,Controller 方法名称中的操作后缀并不表示可见性。
        猜你喜欢
        • 2011-04-19
        • 2020-09-22
        • 2011-10-25
        • 1970-01-01
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        相关资源
        最近更新 更多