3

我不知道我的问题是否应该在这里问。如果是这种情况,请让我知道或移动/删除它。

问题:

为了学习,我正在为一个非常小的个人网站制作自己的小型 MVC“库”。这是正在使用的过程(如果我还没有接近正确的方法,请纠正我):

其中Controller是控制器,action是在控制器上调用的方法。在这种情况下,它最终会是:Controller -> Action ( Argument1 , Argument2 );

现在,如果用户访问:

http://www.Domain.com/Controller/__destruct

或者

http://www.Domain.com/Controller/__get/password

当前解决方案:

  • 通过 $config->getURIFilter() 方法或其他方法运行请求
  • 检查 method_exists() 和 is_callable() 等。
  • 控制器中没有任何不用于处理请求的方法

看起来这不应该是一个问题,而且我的设计是错误的。

PS我已经看过很多优秀的 MVC PHP 框架(CodeIgniter、Yii、CakePHP、Zend、Swiftlet 等)

4

4 回答 4

2

要么让你的控制器只处理特定的动作,例如

/controllers
 /user
  loginController.php
  logoutController.php

然后有只做一件事的课程

class LoginController implements RequestHandler
{
    public function handleRequest(Request $request, Response $response)
    {
        …
    }

    private function someAuxiliaryMethod() {
        …

这样 example.com/user/login 将创建一个新的 LoginController 并调用接口方法handleRequest。这是一种策略模式。

或者 - 如果您不想像这样拆分控制器操作 - 在您的操作后面加上一个单词(Zend 框架这样做):

class UserController
{
    public function loginAction() {
        …

然后在您的引导程序中添加后缀并调用这些方法。

另一个选择是引入一个路由器,它可以将 URL 映射到控制器操作,并且可以选择性地进行清理以过滤掉格式错误的 URL,例如去除下划线。

于 2012-04-15T07:37:03.687 回答
0

我建议您将任何以下划线开头的方法视为私有方法(仅在您执行 method_exists 检查它是否以下划线开头时显示未找到的页面)。

于 2012-04-15T07:31:52.950 回答
0

只需将您不想暴露给控制器的方法标记为私有或受保护。

把事情简单化!

于 2012-04-15T07:38:53.047 回答
0

出于同样的原因,我推出了自己的 MVC 结构一次,我解决这个问题的方法只是做出一个架构决定,在所有可路由的控制器操作前加上“action”这个词,即:

public function actionGetData(){

}

public function actionUpdateSomething() {

}

等等

我这样做的原因:

  • 您可以完全控制类中的 public/protected/private 范围,而不必担心方法是否通过某个 URL 无意中公开。
  • 它使可路由的操作对程序员来说是显而易见的。 public function actionDoSomething()可以通过公共 URL ( /controllerName/doSomething) 清楚地访问,而public function getErDone()不是。
  • 您不必费劲儿地寻找可路由的动作。只需在传入参数前加上“action”,然后查看该方法是否存在。快速简单。

我发现这非常有效。

于 2012-04-15T08:00:08.477 回答