设置程序代码的最佳方法

时间:2013-05-08 09:27:59

标签: php ajax design-patterns

我正在创建一个新程序。它是以我以前从未创造过的方式创建的。该计划基本上包括以下内容:

  • Index.html - 界面,只是HTML代码
  • ActionController.js - 包含在index.html中,它包含对接口元素的jquery挂钩,进行Ajax调用并更新接口
  • ExampleAction.php - ActionController使用Ajax调用的众多“Action”文件之一。它根据文件做了很多事情,但文件的布局是一样的。

我在此设置中遇到的问题如下:

1.我无法为我的数据库类创建单例,因为使用ajax我被迫在每个ExampleAction文件中创建一个新的数据库实例。这是正常行为还是应该可行,这可能是我的代码中的一些内容?如果它应该是可能的,并且它在我的代码中,我会稍后发布。

如果我不够清楚,这就是我尝试过的: - 我将index.html重命名为index.php(ofcourse)。 - 在此文件的顶部包含我的数据库单例。 - 对ExampleAction.php进行了ajax调用。 - ExampleAction.php无权访问数据库类,我必须再次包含它并创建一个新实例。

2.当我进行Ajax调用时,我通过POST发送参数。 ExampleAction的总体布局如下:

$actionInstance = new ExampleAction();
class ExampleAction {
 public __construct() {
  this.GetAction();
 }

 private GetAction() {
  $action = $_POST['action'];
  switch ($action) {
   case "Login":
    this.Login();
    break;
  }

  //Login function, etc. here

 }
}

当然我的真实代码包含清理等等,switch语句更长,它包含更多功能

我不喜欢这两件事。我不喜欢每次调用文件时都必须实例化对象,但我想这不会有帮助。

第二件事是,如果我有很多功能,我的开关会变得很大。

所有这些问题让我觉得我一切都错了。

TL; DR: 我正在寻找设置程序的最佳方法,例如我正在制作的程序。我觉得我的代码运行速度较慢(因为ajax调用量越来越大),并且一分钟内难以维护(因为switch语句不断增加。

2 个答案:

答案 0 :(得分:2)

您必须为每个AJAX调用实例化一个新对象的原因是因为AJAX调用是从客户端向服务器发出的新请求。被调用的脚本没有在你的程序中运行,任何设置都必须在AJAX调用脚本时完成。

解决此问题的最佳方法是使用利用MVC的框架,例如codeigniterZend Framework。简而言之,如果使用正确使用MVC框架,则需要为每个AJAX调用实例化对象,因为这是由控制器处理的,并且您将能够丢失switch语句,因为每个AJAX调用都可以是一个唯一的URI一个处理所有这些不同调用的控制器。

编辑:回复评论 不幸的是,我对Zend Framework没有任何经验,但我确信这个前提与Codeigniter几乎相同。因此,在Codeigniter中,您将拥有一个扩展主控制器的AJAX控制器,因此可以访问数据库以及主控制器中设置的所有其他内容。

在AJAX控制器中,您将拥有不同的方法来处理所有不同的AJAX调用。

//CI_Controller is codeigniter's base Controller
class AjaxController extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->output->set_content_type('application/json');
        // Can make calls to anything a normal controller can do
    }

    public function doSomething() {
        // You have access to the database because you are extending 
        // and calling the parent constructor
        // $this->db->query();
    }

    public function doSomethingElse() {
        ...
    }

要调用这些AJAX函数,您的URI将为http://mysite.com/Ajax/doSomethighttp://mysite.com/Ajax/doSomethingElse

正如我之前所指出的,AJAX调用是从客户端向服务器发出的全新请求。当用户请求页面时,您的PHP代码在服务器上运行,输出发送到客户端。任何javascript都在用户浏览器中运行。如果您的javascript进行了AJAX调用,这是对您的服务器的新请求,并且在您的原始请求的PHP完成后发生。

答案 1 :(得分:1)

很难简单地为您提供最好的方式"为你的程序。

但我建议您深入了解MVC模式并了解它的结构。之后,您可以尝试在自己的代码中实现类似的方法。

这是关于MVC的基本解释,但是请花点时间去谷歌并阅读更多内容,然后再阅读这段文字:

  

以外行人的名义定义MVC

     

记住你在技术上很有头脑   接近代码。 MVC对你来说就像白天一样清晰,但却对此表示赞同   商业'模型,视图,控制器'可以给他们的印象   你患有某种形式的Tourette综合症。 MVC不代表   即使在你定义它们之后,甚至对业务也很重要   码。让企业了解为什么这是答案和   最重要的是,它可能比我预期的任务更多   经验。甚至一些开发人员也很难理解   这有时候。

     

让听众了解MVC是什么以及为什么它适用于我   已经尝试过将MVC应用到不同的行业   听众有更多的参与。一个有效的例子   对于我来说,过去与物业甚至是物业相比   车辆。大多数人与建筑商,木匠,   水管工,电工或看过洪水的财产节目   电视。这种体验是一个很好的平台,可以用来解释原因   像MVC这样的分离工作。我知道你可能在想   不会起作用,因为它与软件不一样,但请记住你   不试图培养业务成为开发人员或拥有   深入了解MVC,简单地向他们解释分离   在生产中是必需的,这就是MVC结构所提供的。

     

举一个如何描述这个的例子我非常简短   解释了分离在财产中的作用。请记住这是   专注于使用不完全开发的系统   不同的解释角度。

     

查看

     

MVC中的视图是表示层。这就是最终用户   一个产品将看到并与之互动。一个系统可以有多个   从命令行输出到的所有不同类型的视图   呈现HTML。大多数情况下,视图不包含业务逻辑   清晰的设计。界面适合用途,是的领域   相互作用。因此,您可以简单地为消费者输出HTML   与企业进行交互或输出SOAP / XML以进行交互。都   使用系统背后的相同业务逻辑,也称为   模型和控制器。

     

在财产世界中,您可以将视图视为内部   居民的财产或财产的外层   与。。。相互作用。内部可以根据目的进行定制   物业可以有许多不同类型的租户。例如a   特定设计的财产可能包含住宅。   相同的内部空间可以很容易地用作办公空间,在那里   虽然在同一财产中有不同的目的。然而   财产结构是一样的。因此在哪个环境中   用户互动不会干扰建筑物的结构。

     

<强>控制器

     

控制器是魔术发生的地方并定义了业务   应用逻辑。这可能是用户发送回复的地方   从视图来看,这个响应用于处理内部   请求的工作方式并将响应处理回用户。   在用户请求购买书籍的情况下进行典型响应。   控制器具有用户ID,付款详细信息,送货地址和   项目选择。然后通过业务处理这些元素   完成购买的逻辑。数据通过系统传递   进入模型层并最终在整个请求满足之后   业务定义,订单构建和用户   收到他们的物品。

     

如果我们将它与属性进行比较,我们可以比较a的顺序   在线预订打开电灯开关。租客会轻弹一下   切换到就像订购一本书一样。交换机本身就是一个   视图层中的元素,它将请求发送到控制器   就像点击网站上的结帐按钮一样。业务逻辑   在这种情况下,电工安装并嵌入其中   财产设计。轻弹开关,完成了   电路。电流贯穿包括保险丝盒在内的所有电线   直接通向灯泡。就像用户收到一个   在这种情况下,房客收到了光。整个过程落后   涉及电力布线的场景是不可见的   承租人。它们只是与空间内的交换机进行交互   那里控制器处理请求。

     

<强>模型

     

MVC中的模型是最底层的,处理核心逻辑   系统的。在大多数情况下,这可以被视为层   与数据源交互。在使用MVC的系统中,控制器   将信息传递给模型以便存储和检索   数据。继上面的控制器定义示例之后,这个   是存储订单详细信息的地方。其他数据,如股票   水平,本书产品的物理位置在很多事情中   都存储在这里。如果这是订购的最后一本书,那么   对此项目的下一个请求可能会检查它是否可用且不允许   该项目的订单不再可用。

     

坚持打开灯开关的例子,这个级别   我们的结构可能是电力供应。当租客轻弹   开关,内部电路必须要求电力供电   当用户从中请求数据时,请求类似   数据库,如处理请求所需的数据。如果是住所   未连接电源,无法完成此过程。   使用MVC带来的商业利益

     

在获得解释MVC的信息后,您将会这样做   必须看看可以从中获得什么好处。我不会去   这里有大量细节,我相信你可以申请福利   更准确哪些与你的实际情况直接相关。至   列出了基于MVC的系统的一些常见好处   几个例子:

     

不同的技能水平可以在不同的系统级别上运行。对于   示例设计人员可以在很少的情况下处理接口(View)   开发知识和开发人员可以处理业务逻辑   (控制器)对设计水平的关注很少。然后他们   简单地完成整合。由于上述原因   分离项目可以更容易,更快速地进行管理。设计师   可以在开发人员之前启动接口,反之亦然。这个   开发过程可以是并行的而不是顺序的   因此缩短了开发时间。容易拥有多种视图类型   使用相同的业务逻辑。通过系统清除路线。您   清楚地知道系统的不同层次。有了   明确的系统路线,逻辑可以共享和改进。这有   因为您清楚地知道允许的路线,所以增加了安全性   数据给用户,并可以进行明确的安全检查   路线。每一层都对自己负责。 (与第1点相关)这个   意味着您可以拥有可以维护的干净文件结构   并且比紧密耦合系统更容易和更快地管理   你可能有很多重复的逻辑。结构清晰意味着   发展将更加透明,这应该导致减少   开发时间,维护问题和发布周期(如果应用)   正常。

有关如何在php中实现MVC的特定PHP示例,请访问:http://phpmaster.com/the-mvc-pattern-and-php-1/

此外:了解控制器会在某个时刻向您显示&#34; View&#34;,此视图可以是html,xml,json等等。所以控制器也会处理你的AJAX请求。