我目前正在尝试更多地了解OpenCart的核心以及它的类实际如何工作。我还试图提高我的OOP技能,因为我仍然在该领域学习,所以也许是我看不到的明显的东西。
我想知道控制器文件如何知道如何找到购物车类(例如)。
E.g。
在目录/控制器/结帐车中(显然删除了代码)
class ControllerCheckoutCart extends Controller {
public function index() {
$this->cart->update();
}
}
Controller类可以在system / engine / controller.php中找到
update()
可以找到system / library / cart。
我假设在controller.php中会有一个指向购物车类的链接,或者是一个由它制作的对象。 (我的基础是使用$this->
)。
那么如何从控制器中找到购物车类?
谢谢
答案 0 :(得分:5)
首先,您的ControllerCheckoutCart
扩展了Controller
类,因此这是我们需要关注的类。您可以在/system/engine/controller.php
。
在这个课程中,有两个我们感兴趣的magic methods。第一个是__construct
,因为在这里加载了一个"注册表"课程(在/system/engine/registry.php
中找到,如果您有兴趣选择那个 - 它非常简单)。
您可以将此视为对商店使用的所有类的查找,例如模型文件,库文件等。在构造中,注册表被传递给控制器,因此它具有对它的引用
public function __construct($registry) {
$this->registry = $registry;
}
第二个也是更重要的魔术方法是__get
方法。当类属性不存在时调用它,如果您希望这样做,您可以自己处理它。 OpenCart使用它来尝试从注册表中获取具有该键的类
public function __get($key) {
return $this->registry->get($key);
}
因此,任何控制器中的$this->cart
都会尝试从注册表中获取具有密钥cart
的对象。如果您查看index.php
文件,您会看到它已在那里分配
// Cart
$registry->set('cart', new Cart($registry));
答案 1 :(得分:0)
ControllerCheckoutCart
扩展 Controller
,这意味着它会继承Controller
中您未在此处看到的所有代码。 Controller
中的某些代码(可能在Controller::__construct
中)正在创建$this->cart
对象。例如:
class Controller {
public function __construct() {
$this->cart = new Cart;
}
}
由于此构造函数由所有子类继承,因此它们也构造自己的$this->cart
并可以使用自己的方法访问它。
答案 2 :(得分:0)
如Jay Gilford所述,您需要在 index.php 和/或 admin / index.php 中注册新添加的库类文件(具体取决于是否你在目录或管理员中使用它)
$registry->set('yourlibraryclass', new YourLibraryClass());
因此,在系统加载时,Opencart知道您的类存在,然后您可以通过以下方式调用其所有函数:
$this->yourlibraryfilename->function();
请注意,您的库文件名通常与您的类名相同,因此在此示例中使用它。
在index.php文件中完成更改后,您需要注销并再次登录才能看到更改。