一遍又一遍地创建 PHP MVC 控制器

Posted

技术标签:

【中文标题】一遍又一遍地创建 PHP MVC 控制器【英文标题】:PHP MVC Controller Created Over and Over Again 【发布时间】:2014-09-02 05:12:47 【问题描述】:

我是 php 新手。我以 MVC 项目为例,我注意到每次按下提交按钮时都会调用我的控制器。问题在于每次按下按钮时都会创建一个新模型。

为了解决这个问题,我使用了一个隐藏字段来检查按钮是否已被按下。如果有,那么我不会实例化新模型,否则我会。控制器代码如下:

 //code listed below is in the controller which is called each time button
 //has been pressed...
 $myModel;//used to access model and its functions from controller
 if(isset($_POST['has_started'])) 
 
     //stores some logic that uses $myModel variable
     playingGame();
 
 else
 
   echo "just starting...";
   $myModel=new HangManModel();
   startGame($myModel);
 

这似乎有效,但是当调用playGame() 时,它告诉我我不能使用$myModel 及其函数,因为它没有被声明,或者它是一个非对象。我怎样才能解决这个问题?感谢您的帮助!

【问题讨论】:

什么是“MVC 项目”,因为您的代码 NOTHING 与 MVC 架构模式有关?! 我认为你在这里有错误的想法。 PHP 旨在通过 HTTP 使用,而 HTTP 是无状态的。这意味着您必须在每个请求上实例化您的控制器。还应该注意的是,php中的“MVC”根本不是真正的MVC(至少你会在C之类的东西中找到) 怎么和MVC无关?上面的代码在我的控制器类中。我试图弄清楚如何防止每次按下“提交”时创建模型。 @Scopey 谢谢,这对我来说更清楚了。但是,不能每次都重新创建模型。如何解决? @JacobKoko 仅仅因为你在代码中调用了“控制器”或“模型”并不会在 MVC 架构中神奇地把它变成。 【参考方案1】:

首先,我在这里没有看到 mvc 模式。 其次,php 执行并生成 htmljavascript 的输出并发送到浏览器。 在下一次回发时,php 不会为此存储任何状态。

据我了解,对于存储状态,您可以使用以下方法之一。

1) Option1-->使用会话。

//code listed below is in the controller which is called each time button
 //has been pressed...
 $myModel;//used to access model and its functions from controller

  if(!isset($_SESSION))session_start();
 if(isset($_POST['someuniqueID'])) 
 
     //stores some logic that uses $myModel variable
     $someuniqueID = $_POST['someuniqueID'];
     $myModel = $_SESSION[$someuniqueID]; //retrieving the session object.
     playingGame($myModel); //passing your model to the main function.
 
 else
 


   echo "just starting...";
   $myModel=new HangManModel();
 //start session 

    $_SESSION['someuniqueID'] =  $myModel; // do not store very complex model object to avoid server memory problem.
   startGame($myModel);
 

2) Option2--> 您可以序列化该对象并将其发送到隐藏字段,然后它将被回发,但这会产生带宽消耗问题。每次发布页面时,它都会来回发送您的模型。

3) Option3--> 如果您的模型很大,请使用数据库并创建一个临时表,您可以在其中存储唯一 id 和序列化的 $myModel 对象。您将需要从数据库中清除不需要的状态。因为与会话和隐藏字段不同,它是永久存储。

【讨论】:

非常感谢!我曾多次使用 MVC 设计模式,但从未在 PHP 中使用过。我会试试这个,感谢您的反馈。

以上是关于一遍又一遍地创建 PHP MVC 控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Firebase 一遍又一遍地创建同一个用户?

据说随机 API 一遍又一遍地返回相同的东西

为啥在反应的“useState”钩子中一遍又一遍地设置初始状态

如何阻止innerHtml表一遍又一遍地重复自己?

为啥 OnPreRender 被一遍又一遍地调用?

命名管道未按预期工作。一遍又一遍地阅读相同的消息