你们很多人都知道有很多PHP框架,我对你的想法感兴趣:Zend Framework有所谓的动作控制器,它必须包含至少一个动作方法,一个名称以“行动”。例如:
public function indexAction() {}
“Action”这个词很重要,如果没有它,你就无法通过URI直接访问该方法。但是,在像Kohana这样的其他一些框架中,您可以使用公共和私有方法,其中公共方法可访问,而私有方法则不可访问。所以我的问题是你认为哪种方法更好?从安全的角度来看,我会投票赞成Zend的方法,但我很想知道其他人的想法。
答案 0 :(得分:1)
真的很喜欢。使用某种命名约定是更通用的(这实际上是Kohana 3现在所做的),因为它允许公共方法不是动作,这可能是有用的。
当然,理想的解决方案是使用某种代码元数据,如.NET's attributes或Java's annotations,但不幸的是,PHP中不存在此功能。
答案 1 :(得分:1)
根据偏好,我对zend框架的方法很满意。它有适当的控制器封装。是的,您必须添加单词action并创建一个视图脚本(可选),以便您通过URL访问它。然而,您仍然可以使用控制器中的私有,受保护和公共函数来获得额外的逻辑。
答案 2 :(得分:1)
这与安全性的关系不如ZF的设计。如您所说,通过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()
。它不是安全功能,也不是Visibility的替代品。使showAction()
受到保护,您也无法通过网址访问它。从技术上讲,如果你不通过常规设置运行它们,你可以从URI调用非动作方法。您可以创建自己的Dispatcher并更改ZF格式化操作名称的方式。
动作后缀有什么好处,它是否使动作方法与控制器中的其他方法明显区分开来。
答案 3 :(得分:0)
Zend有这个,因为在PHP 4中你没有私有/公共,所以他们不得不依赖于命名约定。确实有公共/私人和命名惯例都更安全。
答案 4 :(得分:0)
我会说这取决于个人偏好。这里有很多变化,例如codeigniter的版本是任何以_开头的方法名称都是私有的,其他任何东西都是控制器方法。
就个人而言,我会说使用内置语言控件的任何内容(例如public function
vs private function
)都是最直观的。
编辑:正如弗兰克所说,MOST SECURE方法将使用尽可能多的功能(例如private
以及方法名称)。