Action -methods与PHP框架中的公共方法

时间:2010-04-18 10:40:20

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

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

public function indexAction() {}

“Action”这个词很重要,如果没有它,你就无法通过URI直接访问该方法。但是,在像Kohana这样的其他一些框架中,您可以使用公共和私有方法,其中公共方法可访问,而私有方法则不可访问。所以我的问题是你认为哪种方法更好?从安全的角度来看,我会投票赞成Zend的方法,但我很想知道其他人的想法。

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这与安全性的关系不如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()。它不是安全功能,也不是Visibility的替代品。使showAction()受到保护,您也无法通过网址访问它。从技术上讲,如果你不通过常规设置运行它们,你可以从URI调用非动作方法。您可以创建自己的Dispatcher并更改ZF格式化操作名称的方式。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

编辑:正如弗兰克所说,MOST SECURE方法将使用尽可能多的功能(例如private以及方法名称)。