4

在编写 PHP 代码时,我决定放弃意大利面条式代码并尝试实现 MVC。为了实现 MVC 框架,我发泄到这篇文章 文章开了一个好头,我成功地创建了我的站点,并开发了前端。现在,我正在尝试使用会话和其他成员区功能来实现后端。我的大脑被新信息沸腾了,我的问题多于答案。

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

我想请教一个快速的建议。

我对很多事情感到困惑:

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

这可能是一个常见的问题,一旦它已经完成,它并不复杂。我也很抱歉not very good defined question,但我提前感谢您的帮助。

4

3 回答 3

15

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 个帖子有些有用:thisthisthis

于 2013-06-08T07:30:19.387 回答
5

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

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

正如你可以想象的那样,我们无法在 Stackoverflow 上从技术上回答这些问题。您的问题的未来用户不会有太多用处,而且我们只是不想给出简单的答案。

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

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

并且已经有了一个答案:“在模型中”(不是我刚刚列出的这两点,而是你的一些问题)。

所以首先,Model是 MVC 中的一个层。层是应用程序中的一个特定区域,负责处理(通常是更高级别的)工作。在您的示例中,UserModel的一部分。有关如何在软件程序中组织代码的描述,请参阅Pasta Theory of Software,这应该清楚为什么要使用层——除了 MVC 之外。但在 MVC 中,答案很明确:在模型中。

由于这个答案很明显,这让我有点想知道您所遵循的教程是如何错过的。并且您是否独自面对软件设计的这些基本问题,例如:

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

因为这两个问题对于任何使用对象的软件来说都是相当存在的,即使是那些专门面向对象的软件也不行。

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

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

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

因此,不要认为一个教程是理所当然的。您选择的仅显示以下内容:

  • 作者认为重新发明 URL 解析是值得的。这是简单的代码手淫,因为 PHP 有这个内置。
  • 作者认为不验证输入值是值得的,甚至认为防止代码注入的重要性也是短视的。这真的很可悲。

由于最后一点是完全不可行的,我强烈建议你放弃迄今为止从这些示例中学到的任何东西,然后尝试下一个。请记住,库用户需要决定何时何地创建对象(这意味着所使用的库需要始终允许这样做)并且您使用依赖注入通过您在您的对象图中使用的对象图传递对象应用。

于 2013-06-08T07:05:38.140 回答
-2

为什么不使用可用于 PHP 的众多现有 MVC 框架之一?那里有很多(CakePHP、CodeIgniter、Yii 等)。

如果您真的想重新发明轮子,请继续!然而,现有的框架代表了聪明人大量开发的成果,所以你可以通过采用一个很好的开端。

此外,它们有据可查,并且有很好的教程可以回答您提出的问题以及您尚未提出的许多问题。

于 2013-06-08T05:53:28.350 回答