熟悉MVC - 如何使用会话逻辑,附加类和后台逻辑

And*_*rew 3 php model-view-controller

在编写PHP时,我决定从意大利面条代码转移并尝试实现MVC.为了实现MVC框架,我 发表了这篇文章文章给了一个良好的开端,我设法创建了我的网站,并开发了前端.现在,我正在尝试使用会话和其他成员区域功能来实现后端.我的大脑充满了新的信息,我有更多的问题而不是答案.

我不知道如何实现其他类,user例如类.例如,如果没有MVC,我可以user.php在我的包含目录中创建新的类文件,然后包含它,实例化它,并为对象分配适当的值并将objest置于会话中.

我想请一个表示意见.

我对很多事感到困惑:

  • 我在哪里添加用户类
  • 如何在MVC中添加和包含用户类
  • 我如何在我的应用程序周围携带用户类(我在会话中理解,但会话必须有用户对象的acees
  • 如何执行登录/注销逻辑并执行背景中发生的必要操作

这可能是一个普遍的问题,一旦完成之前就不复杂了.我也为此道歉not very good defined question,但我提前感谢您的帮助.

ter*_*ško 14

User,MVC的上下文,是一个域对象.但是,会话是一种存储介质(就像缓存,数据库或文件系统一样).当您需要存储来自User实例的数据时,您可以使用某种类型的数据映射器来执行此操作.

$user = $this->domainObjectFactory->build('user');
$user->setName('Korben')
     ->setSurname('Dallas');

if ( some_condition )
{
    $mapper = $this->dataMapperFactory->create('session');
    $mapper->store($user);
}
Run Code Online (Sandbox Code Playgroud)

此代码应为会话和用户之间的交互提供极其简化的示例.

我在哪里添加用户类?

作为域对象,User实例应该在服务中使用并使用工厂初始化.在MVC的上下文中,服务是模型层中的结构,其处理应用程序逻辑.它们操纵和促进域对象和存储抽象的交互.

如何在MVC中添加和包含用户类?

应使用自动加载器添加所有类.您应该阅读有关使用的信息spl_autoload_register(),最好是在使用命名空间时.

实例本身的初始化应该由工厂完成.这使您可以将代码与所述实例的类名解耦.

如何在我的应用程序中携带用户类?

你没有.

PHP应用程序不会持久存在.你有一个HTTP请求,你可以用它做你需要的所有事情,发送响应并销毁应用程序.User课堂实例都是短暂的.

要在请求之间恢复当前用户,请在会话中存储标识符.不要在会话中转储整个对象.相反,从会话中获取用户标识符后,您可以从其他存储形式中恢复其余的用户帐户详细信息(如果您需要它).

整个过程应该通过模型层中的某种"识别服务"或"认证服务"来执行和管理.

如何执行登录/注销逻辑并执行所需的操作?

登录请求首先由控制器处理:

public function postLogin( $request )
{
    $service = $this->serviceFactory->create('recognition');
    $service->authenticate( $request->getParameter('username'),
                            $request->getParameter('password') );
}
Run Code Online (Sandbox Code Playgroud)

该服务尝试验证用户的凭据,这会改变模型层的状态.然后,视图实例会查找该状态,并将您重定向到作为经过身份验证的用户的登录页面,或者将您重定向回登录页面并显示错误消息.

服务本身将通过工厂在模型控制器和视图之间共享.这意味着他们只会初始化每个服务一次,然后只重用它.有点像:

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];
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,他是一个极其简化的例子.

如需进一步阅读,我建议您浏览此链接集.此外,你可能会发现这3个帖子有点用处:这个,这个这个.


hak*_*kre 5

所以你在这里有很多问题,让我们简单回顾一下:

  • 我在哪里添加用户类
  • 如何在MVC中添加和包含用户类
  • 我如何在我的应用程序周围携带用户类(我在会话中理解,但会话必须有用户对象的acees
  • 如何执行登录/注销逻辑并执行后台发生的必要操作

您可以想象我们无法在Stackoverflow上专门回答这些问题.对于您的问题的未来用户没有多大用处,我们也不想给出简单的答案.

但是,如果你查看问题列表,你会问一些突出的问题:

  • 对象在哪里创建?
  • 对象如何通过我的应用程序传递?

而且还有一个答案:"在模型中"(不是我刚才列出的这两点,而是你的一些问题).

首先,模型是MVC中的一个层.层是应用程序中的一个特定区域,它在流程中处理(通常是更高级别)的工作.在您的示例中,用户模型的一部分.有关如何在软件程序中组织代码的描述,请参阅面向软件的意义理论,这应该明确为什么要使用层 - 除了特定的MVC.但在MVC中,答案很清楚:在模型中.

由于这个答案是显而易见的,它让我想知道你所遵循的教程是如何错过的.你是否独自留下了软件设计这样的基本问题:

  • 对象在哪里创建?
  • 对象如何通过我的应用程序传递?

因为这两个问题对于任何使用对象的软件都是非常存在的,甚至不是那些特定于面向对象的软件.

所以,让我们直截了当地回答这两个问题:对于MVC,您可以创建一些高级例程,构成构建应用程序的框架.基本上这意味着,您正在创建一个库.某人使用图书馆.那应该决定创建对象的位置.该框架/库不应该规定在哪里创建对象,也不它应该为用户创建对象.所以这个问题需要由框架的消费者而不是框架作者来回答.因此,为了正确处理这个问题,你需要将自己分成两部分,一方面担任图书馆编码员的角色,另一方面担任编码员在图书馆编写应用程序的角色.

我只能强调这个非常简单但基本的观点:当你编写一些库软件/框架时,不要指定创建对象的位置.只需提供证明您的库工作的测试,无需任何应用程序,然后在编写应用程序时只需包含库并使用它.

你问的第二个问题是如何通过我的应用程序传递对象?.快速浏览一下你所链接的教程,你已经可以看到我上面给出的一般建议没有被遵循(这对于快速开发来说至关重要.所以不要被教程的标题误导:用这么复杂的代码吧提供,只有第一个小时已经很快,它已经铺平了复杂开发的道路),而且教程的示例代码不是一个有用的例子,显示如何在应用程序中传递对象的问题的答案.它错过了解释一个非常简单但有效的方法:依赖注入.

所以不要只把一个教程视为理所当然.您选择的那个仅显示以下内容:

  • 作者认为重新发明URL解析是值得的.这是简单的代码手淫,因为PHP有​​这种内置.
  • 作者认为不值得验证输入值是值得的,即使考虑防止代码注入的重要性也是短视的.这真的很难过.

最后一点是完全禁止的,我强烈建议你放弃你从这些例子到目前为止所做的任何事情并尝试下一个例子.请记住,库用户需要决定何时何地创建对象(这意味着所使用的库都需要允许这样做),并且您使用依赖注入来通过您在对象中使用的对象图来传递对象应用.

  • 呐..这个问题太乱了,无法得到可靠的答案.以"我在哪里添加用户类"为例.这可能意味着什么. (3认同)