Tại sao c
chữ thường trong controllers
tên thư mục? Trong khi Model, Block và Helper đang bắt đầu bằng một chữ cái viết hoa?
Tại sao c
chữ thường trong controllers
tên thư mục? Trong khi Model, Block và Helper đang bắt đầu bằng một chữ cái viết hoa?
Câu trả lời:
Các lớp nằm trong các controllers
thư mục là một giống đặc biệt của các lớp.
Bạn không thể viết lại chúng theo cách tương tự như bạn viết lại mô hình hoặc khối bằng cách sử dụng <rewrite>
thẻ trong config.xml
, bạn không thể khởi tạo chúng bằng cách sử dụng một nhà máy như bạn làm cho mô hình ( Mage::getModel()
) hoặc với người trợ giúp ( Mage::helper
) hoặc với khối ( Mage::app()->getLayout()->createBlock()
).
Ý tôi là có Mage::getControllerInstance()
nhưng đó là một chút khác nhau. Thêm về điều này sau.
Bạn có thể nhận thấy rằng họ không thực sự tuân theo quy tắc đặt tên như các lớp khác.
Công việc controllers
không được tìm thấy trong tên lớp.
Hãy lấy ví dụ về bộ điều khiển được tìm thấy trong Mage/Catalog/controllers/CategoryController.php
.
Tên lớp là Mage_Catalog_CategoryController
.
Tôi không thể cung cấp cho bạn một câu trả lời chắc chắn 100%, chỉ có một nhà phát triển cốt lõi có thể làm điều đó.
Nhưng giả định của tôi là ai đó không muốn bộ điều khiển được tự động tải.
Hãy xem phương pháp này Mage_Core_Controller_Varien_Router_Standard::match
. Nó lớn và đáng sợ, nhưng đó là thứ ánh xạ url đến bộ điều khiển và hành động.
Có rất nhiều tính toán được thực hiện nhưng đâu đó có dòng này:
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);
Nếu chúng ta đào sâu hơn, _validateControllerClassName
bạn sẽ kết thúc getControllerFileName
giống như thế này:
public function getControllerFileName($realModule, $controller)
{
$parts = explode('_', $realModule);
$realModule = implode('_', array_splice($parts, 0, 2));
$file = Mage::getModuleDir('controllers', $realModule);
if (count($parts)) {
$file .= DS . implode(DS, $parts);
}
$file .= DS.uc_words($controller, DS).'Controller.php';
return $file;
}
và trong _includeControllerClass
đó về cơ bản làm điều này : include $controllerFileName;
.
Lưu ý phần cứng được mã hóa controllers
trong phương thức getControllerFileName
và lưu ý rằng tệp điều khiển chỉ được bao gồm. Vì vậy, không có tự động tải.
Cuối cùng, nhà máy điều khiển Mage::getControllerInstance()
không định vị lớp và không nhìn vào phần viết lại. Nó chỉ làm return new $class($request, $response, $invokeArgs);
ở đâu $class
là lớp điều khiển.
Lưu ý bên lề : Trong một số mô-đun có một thư mục được gọi là Controller
(với chữ C viết hoa) và các lớp theo tên lớp tiêu chuẩn. Những lớp học không thực sự kiểm soát. Chúng được sử dụng làm lớp cha cho các bộ điều khiển khác trong mô-đun hoặc làm bộ định tuyến.
Lưu ý bên 2 : Điều này không tồn tại trong Magento 2. Tất cả các bộ điều khiển được đặt trong Controller
thư mục.
Marius bạn thật tuyệt vời: D
Câu trả lời của tôi chỉ là:
Đây là tiêu chuẩn Zend Framework: http://framework.zend.com/manual/1.12/en/zend.contler.quickstart.html
controllers
và tôi cho rằng nhóm nòng cốt Mage sẽ là một chuyên gia khung zend. Thanh danh. Cảm ơn đã chia sẻ liên kết đó