2

我正在用 PHP 编写我的第一个真正的 MVC 应用程序。我没有使用框架,因为我的应用程序太小了,以至于我认为从头开始编写所有内容会更快。

在我的应用程序中,用户可以注册、登录然后写入/编辑/删除内容。每条内容都通过数据库中的用户标识列引用其所有者。

我现在要实施用户访问限制(从某种意义上说,用户只能查看/编辑/删除他们的 OWN 内容/项目/模型)。我想知道应该在哪里检查“有效访问”以及在哪里实例化用户对象。

我的意思是,我肯定需要有关控制器、模型和视图中当前用户的信息。所以我在考虑是否有一个全局用户对象(在 index.php 中定义)来存储所有用户信息,这样我就可以从应用程序的每个部分轻松访问它。

目前,此代码段授予我的控制器访问用户信息的权限,然后我还将这些信息存储在传递给视图的数据数组中:

class Controller {
    protected $data, $id, $user;
    public function __construct($action = null, $data = null) {
        if (User::isLoggedIn()) {
            $this->user = new User($_SESSION['user']);
            $this->data['user'] = $this->user;
        }
    }
}

按照这种模式,我必须将用户信息传递给我创建的每个模型,或者让它们实例化自己的用户对象。

去这里的路是什么?全局用户对象,在每个模型中实例化还是将用户对象作为参数传递给模型和视图?

感谢您的帮助!

4

1 回答 1

5

这里有几点需要注意。首先:“然后我还将存储在传递给视图的数据数组中:”

在 MVC 中,视图可以直接访问模型,请在此处查看我的答案How is MVC should work in CodeIgniter以了解其概述。

其次,您的问题实际上是关于依赖管理的。全局变量(以及扩展的静态变量)是有问题的(使所有变量成为全局变量,PHP全局变量是否坏?静态方法与否?)。首选方法是将完全构造的 $user 对象传递给需要它的类。

class Controller {
    protected $data, $id, $user;
    public function __construct(User $user) {
        if ($user->isLoggedIn()) {
    //...
       }
    }
}

但是,在这种情况下,您不能拥有完全构造的用户对象,因为您需要在构造对象之前知道用户是否已登录,因此将映射器、工厂或 DAO 对象传递给构造函数并根据需要创建用户.

class Controller {
    protected $data, $id, $user;
    public function __construct(DataMapper $userMapper) {
        if (isset($_SESSION['user'])) {
    $user = $userMapper->find($_SESSION['user']);
       }
    }
}

然而,最后,如果你接受我的第一点,Views 可以直接访问他们的模型,而不是从他们的控制器获取传递的数据,那么你的控制器可能甚至不需要知道用户是否登录。毕竟这是, 领域逻辑因此属于模型。

于 2012-12-12T13:21:07.130 回答