【问题标题】:PHP MVC from the scratch - How to connect these classes?PHP MVC 从头开始​​ - 如何连接这些类?
【发布时间】:2012-06-05 15:55:54
【问题描述】:

首先,我知道

  • 不要重新发明轮子
  • 有很多 MVC 框架。

这不是为了制作作品,而是为了我的爱好项目。我从头开始编写 MVC 是为了更深入地了解 MVC,并让我自己满意。最后,我可以对自己说:“伙计,你做到了。你自己写了一个 MVC 框架!


现在解决我的问题。通常,我们会在 MVC 中编写一些类,并且从一开始就在那里。我们通常称它们为BootstrapperRouterRegistryConfig。可能还有更多,但我现在想专注于这些。通常,每个请求我们不需要这些类的多个实例(单例?)。我认为从名称本身就很清楚这些类的作用。所以现在我的问题:

谁先开始(我认为是Bootstrapper)?这些类是如何联系在一起的?他们都需要单身吗?我们如何使这些(Bootstrapper 可能是一个例外)的实例可用于应用程序中的其他类(也许我们使用单例)?

【问题讨论】:

  • 引导程序和注册表可能在某些功能中重叠...我会选择一个加载类并跟踪加载内容的引导程序(也可以由注册表完成的任务),然后加载配置如果您尽早需要它...路由器可能是最后一个,因为它需要其他资源才能工作,并且只处理已经启动并运行的框架(因为它路由来自 url 的请求)
  • 唯一的单例应该是数据库类,否则它的反模式,使用$test =& new $clas1 已被弃用,它可以将对象作为参数传递并注入它,这在模型中称为dependency injection您可以使用 phps 自动加载功能。
  • @LawrenceCherone,单例在面向对象的应用程序中没有位置。 根本没有。没有任何借口!
  • @LawrenceCherone ,仅仅因为你真的不擅长依赖注入,这不是借口。在 MVC 中,DB 交互发生在Data Source Layer(通常以DataMapper 的形式)。由于您不应该在对象树的深处有 new 运算符,因此它们将使用 Factory 实例进行实例化。这个工厂可以为每个新的数据源对象提供 same PDO 实例 .. 通过注入。
  • @Joomos:我同意你的看法。 “不要重新发明轮子”是个好主意,但是,学习“别人的轮子”,很难,这就是为什么有些人将“重新发明轮子”作为一个学习过程......

标签: php model-view-controller


【解决方案1】:

由于我现在正在做同样的事情,所以这是我的观点:

  • 不要使用神奇的BootstrapperCoreInitializer 类。最好将该功能放在bootstrap.phpinit.php 文件中。在我的项目中,这样的文件包含其他类之间的所有“连接”(Router 的实例被创建,不同的工厂被注入等等)。

  • 不要在您的应用程序中使用全局状态(RegisterConfig 最有可能引入全局状态)。我建议您观看this lecture playlist 以获得一些见解。

  • 如果答案是“singleton”,你问错问题了

  • 应用程序从哪里开始,取决于您如何创建代码,但不应从类内部将其踢出。想想可能需要了解您的框架如何工作的其他人(包括您,6 个月后)。挖掘认为另一个类,只是为了获得神奇的init() 功能会很烦人。

  • 了解SOLID principlesLaw of Demeter 是什么。

.. 我的两分钱

【讨论】:

  • 那个视频和链接看起来很有趣!我一定会看那些讲座,花时间详细研究这些原则。
  • @Jomoos,这是我在 MVC 主题上制作的两个较早的 cmets,它们也可能与您的研究相关:thisthis
【解决方案2】:

您的问题与 M.V.C. 关系不大,更多的是与使用全局变量或全局值有关。

许多此类,通常每个类需要一个实例(“单例”),并且在某些情况下,无法避免单例,在您的情况下,可以拥有它们。

有哪些书籍、教程没有教,它应该如何在何时何地初始化单例。它从编程语言到编程语言的变化。

而且,在网站的情况下,变量在更改到另一个页面时会失去其值,这变得很复杂。

有一个称为“会话变量”的概念,它与单例一起工作,允许在从一个页面切换到另一个页面时保留值:

http://php.net/manual/en/session.examples.basic.php

假设您有一个网站。它有几个文件和几个页面。其中一些 php 文件被直接调用并被视为“网页”,例如“index.php”。

其他php文件,是库文件,被其他文件“必需”或“包含”,本身不被认为是“网页”。

当用户单击 wbe 页面中的链接,并且浏览器调用另一个网页时,所有这些值都可能丢失。这不像在桌面应用程序中打开另一个表单。

想一想,当用户第一次进入网站时(例如:“index.php”):主文件“包含”或“需要”其他文件,并初始化全局变量或单例:

<?php
// filename: "config.php"

// another includes or requires here

class Config
{
   // begin data section
   public static $UserName;  
   public static $UserPassword;  
   // end data section

   // begin singleton section
   private static $_instance;

   public static function getInstance()
   {
      if (!self::$_instance instanceof self)
      {
         self::$_instance = new self;
      }
      return self::$_instance;
   }
   // end singleton section

   // start session section
   public static function SaveSession()
   {
     $_SESSION['config_username'] =  Config::$UserName;
     $_SESSION['config_password'] =  Config::$UserPassword;
   }   

   public static function RestoreSession()
   {
     Config::$UserName = $_SESSION['config_username'];
     Config::$UserPassword = $_SESSION['config_password'];
   }   
   // end session section

} // class Config

?>    

<?php
// filename: "index.php"

include ("config.php");
// another includes or requires here

class Application
{
   public static function main()
   {
      // prepare session variables
      session_start();

      // prepare singletons here
      $instance = Config::getInstance();

      // this code its an example
      $instance->UserName = "johndoe";
      $instance->UserPassword = "123";
      $instance->SaveSession();

      // all the page construction goes here
      // ...
   }
} //

// program starts here:
Application::main();

?>

当用户切换到另一个页面时,应用程序必须将会话数据重新加载到单例中。

<?php
// filename: "customers.php"

include ("config.php");
// another includes or requires here

class Application
{
   public static function main()
   {
      // copy data from session to singletons
      $instance->RestoreSession();

      // all the page construction goes here
      // ...
   }
} //

// program starts here:
Application::main();

?>

单例之间没有关系,通常是独立的值。

干杯。

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2016-11-17
    相关资源
    最近更新 更多