Magentoのコントローラーでcが小文字になっているのはなぜですか?


28

フォルダー名がc小文字になっているのはなぜcontrollersですか?Model、Block、Helperは大文字で始まりますか?


6
ねえ...どうして下票?これは合法的な質問です。
マリウス

ランダムにフラグを立てる/ダウン投票するメンバーがいます(もちろん名前は教えません)。たとえば、この質問は攻撃的としてフラグが立てられました:D
user487772 14年

@TimBezhashvyly ...ええ、私はそれを理解しています。それは最初に私に不快感を覚えたが、その後私は再び質問を読んだ:)
マリウス

大文字のCを持つコントローラーは、すでに笑っています。
ジュリアンラカル14年

回答:


28

controllersフォルダにあるクラスは、特別な種類のクラスです。タグin
を使用してモデルまたはブロックを書き換えるのと同じ方法でそれらを書き換えることはできません。モデル()またはヘルパー()またはブロック()を使用して、ファクトリを使用してインスタンス化することはできません。 ありますが、それは少し異なります。これについては後で詳しく説明します。 他のクラスのように、実際には命名規則に従っていないことに気付くかもしれません。 作品はクラス名に見つかりません。 たとえば、にあるコントローラーを見てみましょう。 クラス名はです。 100%確実な答えを出すことはできません。コア開発者のみがそれを行うことができます。<rewrite>config.xmlMage::getModel()Mage::helperMage::app()->getLayout()->createBlock()
Mage::getControllerInstance()

controllers
Mage/Catalog/controllers/CategoryController.php
Mage_Catalog_CategoryController

しかし、私の想定では、誰かがコントローラーを自動ロードすることを望まなかったということです。

このメソッドを見てくださいMage_Core_Controller_Varien_Router_Standard::match。それは大きくて怖いですが、それはURLをコントローラーとアクションにマッピングするものです。
多くの計算が行われていますが、どこかにこの行があります:

$controllerClassName = $this->_validateControllerClassName($realModule, $controller);

さらに深く掘り下げる_validateControllerClassNamegetControllerFileName、次のようになります。

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;
}

その中_includeControllerClassで基本的にこれを行います:include $controllerFileName;

controllersメソッドにハードコーディングされていることgetControllerFileNameに注意してください。コントローラーファイルが含まれているだけです。オートロードはありません。

最後に、コントローラーファクトリMage::getControllerInstance()はクラスを見つけず、書き換えを調べません。コントローラークラスがreturn new $class($request, $response, $invokeArgs);どこにあるかだけを行い$classます。

サイドノート:一部のモジュールにはController(大文字のCで)と呼ばれるフォルダーがあり、クラスは標準のクラス命名に従います。これらのクラスは実際にはコントローラーではありません。これらは、モジュール内の他のコントローラーの親クラスとして、またはルーターとして使用されます。

サイドノート2:これはMagento 2には存在しません。すべてのコントローラーはControllerフォルダーにあります。


15

マリウスあなたはとても素晴らしいです:D

私の答えはただだったでしょう:

これはZend Frameworkの標準です:http : //framework.zend.com/manual/1.12/en/zend.controller.quickstart.html


1
実際には良い答えです。
マリウス

1
これは美しい答えです。これはマリウスよりも正しい答えだと思います。Zend Frameworkの開発者は他のディレクトリについては考えないので、controllersMageコアチームはzendフレームワークの専門家だと思います。称賛。そのリンクを共有してくれてありがとう
ラジェエフKトミー14年

非常に役立つ
アミットベラ

1
うん、これも正解だと思う。私はZF規格を見ることすらしませんでした。論理的な説明を見つけようとしました。私の弁明において、私はそれが私の意見だと答えた。
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.