【问题标题】:Using a class method in a script在脚本中使用类方法
【发布时间】:2014-10-14 09:33:50
【问题描述】:

我有一个名为 99bill_received.php 的脚本文件。

在该脚本中,我需要在名为 ModelCheckoutOrder 的类中调用方法 update(),该类位于与此 PHP 脚本不同的路径中。

update()方法所在的类名叫做ModelCheckoutOrder

对于大多数 OpenCart 扩展,PHP 文件是类文件,因此您可以在不初始化对象的情况下固有地调用这样的东西。

/**
 * Updates an existing order history using the order_id and the updated
 * order_status
 * @param $order_id
 * @param $order_status
 */
function update_order_history($order_id, $order_status)
{
    // load the order.php file
    $this->load->model('checkout/order');

    // Execute update()
    $this->model_checkout_order->update(
        $order_id,
        $order_status,
        "",
        true
    );
}

注意$this->load->model() 行。您无需初始化 ModelCheckoutOrder 对象即可使用它(如果我在这里错了,请纠正我)。

我的问题是——如何在我的 PHP 脚本文件中访问这个类方法?我目前不在 OpenCart .php 脚本中 - 仅调用它是因为我需要访问函数 update()一个 OpenCart 文件。

我尝试使用$model = new ModelCheckoutOrder() 初始化ModelCheckoutOrder 类,但它没有按我的预期工作(意思是,我不知道什么是对的或错的)。请原谅我对OOPHP的无知。

【问题讨论】:

标签: php opencart


【解决方案1】:

首先 - 为什么你的文件只是一个脚本? OpenCart 是使用 MVC 模式构建的,因此即使您的 脚本 也应该是 控制器,如下所示:

class ControllerPayment99BillReceived extends Controller {

    public function callback() {
        if ($this->request->server['REQUEST_METHOD'] === 'POST' && isset($this->request->post['order_id'])) {
            $this->update_order_history($this->request->post['order_id'], <ORDER_STATUS_ID>);
        }
    }

    private function update_order_history($order_id, $order_status) {
        // load the order.php file
        $this->load->model('checkout/order');

        // Execute update()
        $this->model_checkout_order->update($order_id, $order_status, "", true);
    }
}

现在有了这样的控制器和它的方法(在 MVC 中它被称为 action),它可以通过这样的 URL 访问:

http://example.com/index.php?route=payment/99bill_received/callback

通过 POST 请求传输必要的值。当然应该有更多的变量和进一步的验证请求来自支付网关的响应,这样它就不会被攻击者滥用。

第二 - 你说 对于大多数 OpenCart 扩展,PHP 文件是类文件 - 不幸的是这是真的。我的意思是在某些情况下,扩展带有 scripts 而不是 controllers(因此破坏了 MVC)。但这是一个坏习惯,缺乏经验/专业。

所以要回答您的(隐藏的)问题:如果您在 OpenCart 的 MVC(控制器或模型)中,您可以访问 OpenCart 的 IoC(控制反转)实现 - 注册表 - 您可以从中获取其他系统对象(客户、税收、货币等)或模型(通过加载它们)。

因此你可以调用

$this->load->model('checkout/order');

但您必须在控制器内部(即扩展基础 Controller)。

编辑回答问题:

  1. 我的错,callback 应该在 URL 中,并且这个将在请求期间被调用(已经更改了 URL 示例)。
  2. 您可以有两个控制器或只有一个控制器(在所有支付模块中都是如此)。在 一个控制器 的情况下,您有方法 index 被调用用于主要功能和方法 callback 用于来自支付网关的响应(可以在成功支付后调用或在错误的情况下调用 -但是你应该在那里处理所有的情况)。
  3. 虽然看起来情况并非如此。 PHP 没有像在 Java 中那样一直调用的 main 方法。但是在许多 MVC 框架中(我们现在可能将 OpenCart 视为一个框架,即使它不是),它的实现方式是,如果您向一个没有定义显式操作(方法)的 URL 发出请求(至少是控制器必须是)框架尝试调用(执行)该控制器上的index 方法。

【讨论】:

  • 非常感谢 shadyyx。你完全回答了我的问题。的确,这确实是由于我对脚本与 MVC 的崩溃缺乏经验。我现在将进行这些更改。
  • 你能解释一下callback()的目的吗?另外,我的第二个问题是 - 对于这个 99Bill 扩展,在同一个类中有两个 Controller 文件可以吗?我有一个 bill99.php 控制器文件,它执行扩展的主要功能。这个received.php 只有在交易成功后才会被调用。
  • 第三个问题 - index() 函数是 main() 函数的 Java 等效项吗?
  • 查看我编辑的答案,您可以在其中找到问题的答案。
  • Man shadyyx - 非常感谢你。我在开发 OpenCart 时遇到了一些问题,因为我对一些设计模式概念不清楚,而您为我解决了所有问题。
【解决方案2】:

在 opencart 中使用以下结构是最好的。

用于加载 ModelCheckoutOrder 类

$this->load->model('checkout/order');

$this->model_checkout_order->update(
        $order_id,
        $order_status,
        "",
        true
    );

【讨论】:

  • 这与我在示例中的代码完全相同。我目前的问题是在课堂之外调用它。我不太清楚如何表达。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2020-03-12
  • 2014-07-30
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多