User
,MVC 的上下文,是一个域对象。然而,会话是一种存储介质(就像缓存、数据库或文件系统一样)。当您需要从User
那里存储实例的数据时,您可以使用某种类型的数据映射器来完成它。
$user = $this->domainObjectFactory->build('user');
$user->setName('Korben')
->setSurname('Dallas');
if ( some_condition )
{
$mapper = $this->dataMapperFactory->create('session');
$mapper->store($user);
}
此代码应该为会话和用户之间的交互提供一个极其简化的示例。
我在哪里添加用户类?
作为域对象,User
实例应该在服务内部使用并使用工厂进行初始化。在 MVC 的上下文中,服务是模型层中的结构,它处理应用程序逻辑。它们操纵和促进域对象和存储抽象的交互。
如何向我的 MVC 添加和包含用户类?
您的所有类都应该使用自动加载器添加。您应该阅读有关使用的信息spl_autoload_register()
,最好是在使用名称空间时阅读。
实例本身的初始化应该由工厂完成。这使您可以将代码与所述实例的类名分离。
如何在我的应用程序中携带用户类?
你没有。
PHP 应用程序不会持续存在。你有一个 HTTP 请求,你用它做所有你需要的事情,发送响应并销毁应用程序。类的实例User
都是短暂的。
要在请求之间恢复当前用户,您可以在会话中存储一个标识符。不要在 session 中转储整个对象。相反,在您从会话中获取用户的标识符后,您可以从其他形式的存储中恢复其余的用户帐户详细信息(如果您甚至需要它)。
这整个过程应该由模型层的某种“识别服务”或“身份验证服务”来执行和管理。
如何执行登录/注销逻辑并执行所需的操作?
登录请求首先由控制器处理:
public function postLogin( $request )
{
$service = $this->serviceFactory->create('recognition');
$service->authenticate( $request->getParameter('username'),
$request->getParameter('password') );
}
该服务尝试验证用户的凭据,这会改变模型层的状态。然后,视图实例查找该状态,并将您作为经过身份验证的用户重定向到登录页面,或者将您重定向回带有错误消息的登录页面。
服务本身将通过工厂在模型控制器和视图之间共享。这意味着他们只会初始化每个服务一次,然后就可以重用它。类似于以下内容:
class ServiceFactory
{
private $cache = array();
public function create( $name )
{
if ( array_key_exists($name, $this->cache) === false )
{
$this->cache[$name] = new $name;
}
return $this->cache[$name];
}
}
请记住,他是一个极其简化的示例。
为了进一步阅读,我建议您浏览此链接集合。此外,您可能会发现这 3 个帖子有些有用:this、this和this。