gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:20:07 25 4
gpt4 key购买 nike

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

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

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

我的意思是,我绝对需要 Controller 、模型和 View 中有关当前用户的信息。所以我在想是否有一个全局用户对象(在 index.php 中定义)来存储所有用户信息以便我可以从我的应用程序的每个部分舒适地访问它。

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

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;
}
}
}

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

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

感谢您的帮助!

最佳答案

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

在 MVC 中, View 可以直接访问模型,在这里查看我的回答 How is MVC supposed to work in CodeIgniter对此的概述。

其次,您的问题实际上是关于依赖管理的。全局(以及扩展静态)是有问题的( Make all variables global, PHPAre global variables bad?Static methods or not? )。首选方法是将完全构造的 $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']);
}
}
}

然而,最后,如果你接受我的第一点,即 View 可以直接访问它们的模型,而不是通过它们的 Controller 获取传递的数据,那么你的 Controller 可能甚至不需要知道用户是否登录。这是,毕竟,领域逻辑属于模型。

关于PHP:MVC 用户身份验证和全局用户对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com