Phalcon 多模块开发的两种方法

widuu 2015-4-24 PHP技术 3,814 1 喜欢 (0)

前提介绍

  1. 来个小广告,www.lingphp.com 上线,希望喜欢C语言框架的朋友多去发发文章和问题。新站,目标就一个想补全 C 框架资料不全的问题。
  2. phalcon 安装问题出现 " php_pdo_get_dbh_ce " ,我已经发在社区了,请点击这里;
  3. 为什么是两种方法呢?因为一种是个人意淫,一种是官方给的。好不多说下边是介绍,主要是代码。

The First Way

第一种是个人意淫的方法,先注册命名空间,然后,添加 Route 规则,让他根据 ROUTE 规则来加载,代码如下:

//注册命名空间
$Loader = new Loader();
$Loader->registerNamespaces(
    array(
       'Admin\Controllers' => BASE_PATH."/app/admin/controllers/",
       'Admin\Models'      => BASE_PATH."/app/admin/models/",
       'Home\Controllers'  => BASE_PATH."/app/home/controllers/",
       "Home\Models"       => BASE_PATH."/app/home/models/"
    )
)->register();



$di->set('router',function(){
    //注册路由
    $Router = new Router();
    //添加Admin 命名空间路由
    $Router->add(
        '/admin/:controller/:action',
        array(
            'namespace'  => 'Admin\Controllers',
            'controller' => 1,
            'action'     => 2,
        )
    );
    $Router->add(
        '/admin/:controller/:action/:params',
        array(
            'namespace'  => 'Admin\Controllers',
            'controller' => 1,
            'action'     => 2,
            "params"     => 3,
        )
    );
});

这样,当我们访问 http://{host}/admin/index/index 或者 http://{host}/admin/index/index/任意参数 就按照 Admin\Controllers 走了,其它的都按照 Home 方向走。

The Anthor Way

这种方法是官方给的,如果你看过 Phalcon 的源代码了,对这方面会很了解。直接看管方文档可能不太好了解。

  1. 官方给的实例代码
    // 注册模块
    $application->registerModules(
        array(
            'frontend' => array(
                'className' => 'Multiple\Frontend\Module',
                'path'      => '../apps/frontend/Module.php',
            ),
            'backend'  => array(
                'className' => 'Multiple\Backend\Module',
                'path'      => '../apps/backend/Module.php',
            )
        )
    );
    

打开 apps/backend/Module.php 看下代码,其中主要代码如下:

   /**
     * 注册指定模块的加载文件
     */
    public function registerAutoloaders()
    {

        $loader = new Loader();

        $loader->registerNamespaces(
            array(
                'Multiple\Backend\Controllers' => '../apps/backend/controllers/',
                'Multiple\Backend\Models'      => '../apps/backend/models/',
            )
        );

        $loader->register();
    }

    /**
     * 注册指定模块的服务
     */
    public function registerServices($di)
    {

        //Registering a dispatcher
        $di->set('dispatcher', function() {
            $dispatcher = new Dispatcher();
            $dispatcher->setDefaultNamespace("Multiple\Backend\Controllers");
            return $dispatcher;
        });

        //Registering the view component
        $di->set('view', function() {
            $view = new View();
            $view->setViewsDir('../apps/backend/views/');
            return $view;
        });
    }

其中,我们如果看 phalcon/mvc/application.zep 的源代码的 handle() 中就能看到,他会先查找 model

        /**
         * Gets the module definition
         */
        let module = this->getModule(moduleName);

然后在根据模块去注册自动加载和服务

    let moduleObject = <ModuleDefinitionInterface> dependencyInjector->get(className);

    /**
     * 'registerAutoloaders' and 'registerServices' are automatically called
     */
    moduleObject->registerAutoloaders(dependencyInjector);
    moduleObject->registerServices(dependencyInjector);

URL访问还待自己注册路由,简单点你可以如下代码:

$router = new Phalcon\Mvc\Router(false);

$router->add('/:module/:controller/:action/:params', array(
    'module' => 1,
    'controller' => 2,
    'action' => 3,
    'params' => 4
));

其中 model 匹配的就是 Model ,参数是一一对照的,前后顺序可以随意修改,这4个就只能匹配 /model/controller/action/param 你也可以根据需求自己多定制几个,我这就是一个演示,如果有问题可以留言或者加入我们的社区 www.lingphp.com

转载请注明来自微度网络,本文标题:《Phalcon 多模块开发的两种方法》

喜欢 0 发布评论
Top