PHP:MVC 用户身份验证和全局用户对象?

Mac*_*cks 2 php authentication model-view-controller

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

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

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

我的意思是,我绝对需要有关控制器、模型和视图中当前用户的信息。因此,我在考虑是否可以拥有一个全局用户对象(在 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

感谢您的帮助!

Tom*_*m B 5

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

在 MVC 中,视图可以直接访问模型,请参阅我在此处的回答MVC 应该如何在 CodeIgniter 中工作以获得对此的概述。

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

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

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

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

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