3

Yii フレームワークは、コントローラー ディレクトリ内のモジュールとサブディレクトリもサポートするため、特定のアクションへのパスは次のようになります。

  • /index.php?r=module/controller/actionまた
  • /index.php?r=subdirectoryInControllerDir/controller/action.

ここでの私の目標は、controllers ディレクトリに複数のサブディレクトリを作成することです。これらのフォルダー内に、名前空間を使用して親と同じ名前のコントローラーを作成します。

しかし、私が書くなら

namespace mynamespace;
class MyController extends \MyController {
}

Yii はMyController代わりにロードしますmynamespace\MyController;

ここに何か提案はありますか?

4

1 に答える 1

1

Yii は名前空間に直観的な命名規則を使用します。名前空間は \application から始まり、組み込みの autoload 構成のように物理ディレクトリ構造に従わなければなりません。ベースの MyController クラスが protected/controllers/ にある場合は、それを使用する必要がありますnamespace application\controllers;

<?php
namespace application\controllers;
class MyController extends \CController
{
    // actions
}

protected/controllers/subdir/ の子 MyController

<?php
namespace application\controllers\subdir;
class MyController extends \application\controllers\MyController
{
    // actions
}

「subdir/my」のようなリクエストを機能させるにはCWebApplication::createController()、クラス ファイルをインクルードした直後に次のコードを追加 (またはサブクラスで継承) する必要があります。

    if(!class_exists($className,false))
        require($classFile);
+   if(!class_exists($className,false))
+       $className = '\\application\\controllers\\' . str_replace('/', '\\', $controllerID . $className);
    if(class_exists($className,false) && is_subclass_of($className,'CController'))
    {
        $id[0]=strtolower($id[0]);
        return array(
            new $className($controllerID.$id,$owner===$this?null:$owner),
            $this->parseActionParams($route),
        );
    }

のセットcontrollerNameSpaceがあるCWebApplication場合は、ハードコーディングの代わりにその値を使用することもできます\\application\\controllers\\

于 2013-05-02T00:14:15.950 に答える