Tại sao c là chữ thường trong bộ điều khiển của Magento?


28

Tại sao cchữ thường trong controllerstên thư mục? Trong khi Model, Block và Helper đang bắt đầu bằng một chữ cái viết hoa?


6
Hey ... tại sao các downvote? Đây là một câu hỏi hợp pháp và thực sự tốt.
Marius

Có một thành viên (tôi sẽ không nói tên của khóa học), người đang gắn cờ / hạ cấp ngẫu nhiên. Ví dụ: câu hỏi này được gắn cờ là gây khó chịu: D
user487772

@TimBezhashvyly ... vâng tôi hiểu điều đó. Nó bắt đầu gây khó chịu cho tôi khi bắt đầu nhưng sau đó tôi lại đọc câu hỏi :)
Marius

Kiểm soát viên với một vốn C đã được thực hiện haha.
Julien Lachal

Câu trả lời:


28

Các lớp nằm trong các controllersthư 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 controllerskhô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, _validateControllerClassNamebạn sẽ kết thúc getControllerFileNamegiố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 controllerstrong phương thức getControllerFileNamevà 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 $classlà 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 Controllerthư mục.


15

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


1
Đó thực sự là một câu trả lời tốt.
Marius

1
đây là một câu trả lời hay Tôi nghĩ rằng đây sẽ là câu trả lời đúng hơn Marius. Bởi vì một nhà phát triển khung zend sẽ không nghĩ về một thư mục khác ngoài controllersvà 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 đó
Rajeev K Tomy

Rất giúp đỡ fulll
Amit Bera

1
Đúng, tôi nghĩ rằng đây là câu trả lời đúng. Tôi thậm chí không buồn nhìn vào các tiêu chuẩn ZF. Tôi chỉ cố gắng tìm một lời giải thích hợp lý. Để bảo vệ tôi, tôi đã nói trong câu trả lời rằng đó là ý kiến ​​của tôi.
Marius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.