2

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

public function indexAction() {}

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

4

5 回答 5

1

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

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

于 2010-04-18T10:58:45.643 回答
1

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

引用参考指南

的工作流程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 格式化动作名称的方式。

动作后缀有什么好处,它使动作方法与控制器中的其他方法明显区分开来。

于 2010-04-19T07:34:29.343 回答
1

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

于 2010-04-19T04:58:36.627 回答
0

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

于 2010-04-18T10:45:39.430 回答
0

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

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

编辑:正如弗兰克所说,最安全的方法将是一种使用尽可能多的特性(例如private方法名称)的方法。

于 2010-04-18T10:46:11.623 回答