Php 在脚本中使用类方法
我有一个脚本文件,名为Php 在脚本中使用类方法,php,opencart,Php,Opencart,我有一个脚本文件,名为99bill\u received.php 在该脚本中,我需要在名为ModelCheckoutOrder的类中调用方法update(),该类位于与此PHP脚本不同的路径中 update()方法所在的类名称为ModelCheckoutOrder 对于大多数OpenCart扩展,PHP文件都是类文件,因此您可以在不初始化对象的情况下调用类似的内容 /** * Updates an existing order history using the order_id and th
99bill\u 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 modelscheckoutorder()
初始化modelscheckoutorder
类,但它没有按照我的预期工作(也就是说,我不知道什么是对的还是错的)。请原谅我对OOPHP的无知。在opencart中使用以下结构是最好的
用于加载ModelCheckoutOrder类
$this->load->model('checkout/order');
$this->model_checkout_order->update(
$order_id,
$order_status,
"",
true
);
首先-为什么您的文件只是一个脚本?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);
}
}
http://example.com/index.php?route=payment/99bill_received/callback
而必要的值是通过POST请求传输的。当然,应该有更多的变量,并进一步验证该请求是作为来自支付网关的响应而来的,这样攻击者就不会滥用该请求
第二,对于大多数OpenCart扩展,PHP文件都是类文件,不幸的是这是真的。我的意思是,有些情况下,扩展附带脚本而不是控制器(从而破坏了MVC)。但这是一个坏习惯,缺乏经验/专业性
因此,为了回答您的(隐藏的)问题:如果您在OpenCart的MVC(控制器或模型)中,您可以访问OpenCart的IoC(控制反转)实现-到注册表-从中可以获得其他系统对象(客户、税务、货币等)或模型(通过加载它们)
所以你可以打电话
$this->load->model('checkout/order');
但您必须在控制器内部(即扩展基本控制器
)
编辑回答以下问题:
回调
应该在URL中,并且在请求过程中将调用此回调(已更改URL示例)index
,以及为来自支付网关的响应调用的方法callback
(可以在成功支付后调用,也可以在发生错误的情况下调用-但是您应该在那里处理所有案例)main
方法。但是在许多MVC框架中(我们现在可以考虑OpenCART作为一个框架,即使它不是),它的实现方式是,如果您对一个没有显式动作(方法)定义的URL进行请求(至少必须是控制器),则该框架试图调用(执行)该控制器上的<代码>索引< /代码>方法。我不知道,它是否对您有帮助,但请检查一下:这与我的示例中的代码完全相同。我现在的问题是在课外打电话。我不太清楚该如何表达。非常感谢shadyyx。你完全回答了我的问题。这是真的,这确实是因为我对脚本vs.MVC的失败缺乏经验。我现在要做这些更改。您能给我解释一下
callback()
的用途吗?另外,我的第二个问题是-对于这个99Bill扩展,在同一个类中有两个Controller
文件可以吗?我有一个bill99.php
Controller文件,它执行扩展的主要功能。这个received.php
只有在成功的事务之后才会被调用。第三个问题-index()
函数是否是main()
函数的Java等价物?请查看我编辑的答案,在那里你可以找到你的问题的答案。Man Shadyyyx-非常感谢你。我在为OpenCart开发时遇到了一些问题,因为我对一些设计模式概念不太清楚,而您为我解决了所有这些问题。