2

我正在创建一个新程序。它的创建方式是我以前从未创建过的。该程序主要包括以下内容:

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

我在使用此设置时遇到的问题如下:

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

如果我不够清楚,这就是我尝试过的: - 我将 index.html 重命名为 index.php (当然)。- 在这个文件的顶部包括我的数据库单例。- 对 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 语句。

4

2 回答 2

2

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

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

编辑:回复评论 不幸的是,我对 Zend 框架没有任何经验,但我确信前提与 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 完成后发生。

于 2013-05-08T09:38:33.347 回答
1

简单地为您的程序提供“最佳方式”是相当困难的。

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

这是关于 MVC 的基本解释,但请花时间去 google 阅读更多内容,而不仅仅是这段文字:

通俗地定义 MVC

请记住,您具有技术头脑并且接近代码。MVC 对您来说一清二楚,但对业务人员说“模型、视图、控制器”可能会给他们一种印象,即您患有某种形式的抽动秽语综合征。即使在您根据代码定义 MVC 之后,MVC 对业务也没有多大意义。让企业了解为什么这是答案,最重要的是它是什么,这可能比我的经验预期的任务更多。甚至一些开发人员有时也很难理解这一点。

为了让听众了解 MVC 是什么以及它为什么起作用,我在通行证中尝试过的是将 MVC 应用到听众更多参与的不同行业。与财产甚至车辆相比,过去对我有用的一个例子。大多数人都与建筑商、木匠、水管工、电工打过交道,或者在电视上观看过大量的房地产节目。这个经验是一个很好的使用平台,可以解释为什么像 MVC 这样的分离是有效的。我知道您可能会认为这不会起作用,因为它与软件中的不同,但请记住,您并不是要训练企业成为开发人员或深入了解 MVC,只是向他们解释分离在生产中是必需的,这就是 MVC 结构所提供的。

为了举例说明如何描述这一点,我已经非常简要地解释了分离在财产中的作用。请记住,这侧重于使用未开发的系统,这可能是一个完全不同的解释角度。

看法

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

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

控制器

控制器是魔法发生的地方,它定义了业务应用程序逻辑。这可能是用户从视图发送响应的地方,然后此响应用于处理请求的内部工作并将响应处理回给用户。以用户请求购买书籍的典型响应为例。控制器具有用户 ID、付款详情、送货地址和商品选择。然后通过业务逻辑处理这些元素以完成购买。数据通过系统传递到模型层,最终在整个请求满足业务定义后,订单被构建,用户收到他们的商品。

如果我们将其与房产进行比较,我们可以将在线订购一本书与打开电灯开关进行比较。租户将打开开关,就像订购一本书一样。开关本身是视图层中的一个元素,它将请求发送到控制器,就像单击网站上的结帐按钮一样。在这种情况下,业务逻辑是电工安装并嵌入到物业设计中的。轻弹开关,完成电路。电力通过包括保险丝盒在内的所有电线直接通向灯泡。就像用户收到一本书一样,在这种情况下租户收到光。租户看不到涉及电力布线的整个幕后过程。

楷模

MVC 中的模型是最底层的,处理系统的核心逻辑。在大多数情况下,这可以被视为与数据源交互的层。在使用 MVC 的系统中,控制器将信息传递给模型以存储和检索数据。继上面的控制器定义示例之后,这是存储订单详细信息的位置。诸如库存水平、图书产品的物理位置等附加数据都存储在这里。如果这是订购的最后一本书,则对该项目的下一个请求可能会检查它是否可用,并在该项目不再可用时拒绝该订单。

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

在您得到解释 MVC 是什么的信息后,您将不得不看看可以从中获得什么好处。在这里我不打算详细介绍,我相信您可以更准确地应用与您的实际情况直接相关的福利。为了列出基于 MVC 的系统的一些常见好处,这里有几个示例:

不同的技能水平可以在不同的系统水平上工作。例如,设计人员只需很少的开发知识就可以在界面(视图)上工作,而开发人员可以在业务逻辑(控制器)上工作,而对设计级别的关注很少。然后他们在完成时简单地整合在一起。由于上述分离项目可以更容易和更快地管理。设计人员可以在开发人员之前启动接口,反之亦然。这个开发过程可以是并行的,而不是顺序的,因此减少了开发时间。使用相同的业务逻辑很容易拥有多个视图类型。通过系统清除路线。您清楚地知道系统的不同级别在哪里。有了清晰的系统路径,逻辑就可以共享和改进。这增加了安全优势,因为您清楚地知道从数据到用户的允许路径,并且可以沿路径进行明确的安全检查。每一层都对自己负责。(与第 1 点有关)这意味着您可以拥有干净的文件结构,与可能有大量重复逻辑的紧密耦合系统相比,可以更轻松、更快速地维护和管理它。拥有清晰的结构意味着开发将更加透明,如果应用得当,这将减少开发时间、维护问题和发布周期。(与第 1 点有关)这意味着您可以拥有干净的文件结构,与可能有大量重复逻辑的紧密耦合系统相比,可以更轻松、更快速地维护和管理它。拥有清晰的结构意味着开发将更加透明,如果应用得当,这将减少开发时间、维护问题和发布周期。(与第 1 点有关)这意味着您可以拥有干净的文件结构,与可能有大量重复逻辑的紧密耦合系统相比,可以更轻松、更快速地维护和管理它。拥有清晰的结构意味着开发将更加透明,如果应用得当,这将减少开发时间、维护问题和发布周期。

可以在此处找到有关如何在 php 中实现 MVC 的特定 PHP 示例:http: //phpmaster.com/the-mvc-pattern-and-php-1/

另外:了解控制器会在某些时候为您呈现“视图”,该视图可以是 html、xml、json 或其他任何内容。所以控制器也会处理你的 AJAX 请求。

于 2013-05-08T09:31:50.017 回答