【Phalcon】multi-module での 名前空間

システムのタイプを multi-module にすると名前空間が絡んでくる。

以下に設定方法をまとめる。

まずは Modules.php
自動生成される registerAutoloaders() で Controller と Models の名前空間を確認する。
自動生成であれば問題ないはず。

<?php
class Module implements ModuleDefinitionInterface {

    public function registerAutoloaders(){
        $loader = new Loader();

        $loader->registerNamespaces(array(
            'My_project\Frontend\Controllers' => __DIR__ . '/controllers/',
            'My_project\Frontend\Models' => __DIR__ . '/models/',
        ));

        $loader->register();
    }
}


次は Model の設定。
上記の設定でModelsディレクトリ直下のファイル群は 'My_project\Frontend\Models' という名前空間なので、
各クラスで名前空間を設定する。

<?php

namespace My_project\Frontend\Models;

class Companies extends \Phalcon\Mvc\Model{
	........
}


Controllerでも同じように名前空間を設定する。
Controller内で利用するクラスは use を使って定義しておく。

<?php

namespace My_project\Frontend\Controllers;

use My_project\Frontend\Models\Companies;
  
class IndexController extends ControllerBase {
    
    public function indexAction(){  
        $c = new Companies();  
        $c = $c->getAllData(); 
        print_r($c[0]);
        exit();
    }
}

以上でCompaniesクラスがControllerで利用可能になる。


また、Phalconの既存クラスも名前空間を指定しないと、
Controllerの名前空間に設定されてしまう。
以下はViewをレンダリングしないようにする設定だが、
Controllerに名前空間を指定しているので、
use を使って Phalcon\Mvc\View as View にしないと、
Viewクラスが正しく認識されない。

<?php                          

namespace Dir_project\Frontend\Controllers;

use Phalcon\Mvc\View as View;  
  
class IndexController extends ControllerBase{   
        
    public function indexAction(){  
        $this->view->setRenderLevel(View::LEVEL_NO_RENDER);
        echo 'test';
    }
  
}