Phalcon多模块路由

时间:2015-07-16 20:05:36

标签: php phalcon

我试图使用Phalcon PHP Framework的多模块配置。

我遇到了与路由有关的问题,因为我的某个模块无法通过网址访问。似乎每次我尝试访问已定义的模块uri时,它都会尝试调用默认模块命名空间。 Project\Module1\Controllers\Module2Controller handler class cannot be loaded

想法解决方案

url.com/module1  => module1
url.com/moudle2  => module2
url.com          => module1

在努力解决此问题时,我已验证所有路径和命名空间都是正确的。我用xdebug梳理过它。

我用Phalcon Devtools创建了我的项目,定义了多模块类型,因为它为我提供了一个骨架。当我使用这种方法时,它提供了一个默认的路由方法,它解释每个已注册的模块并将其绑定到URL。这对我来说似乎没有用。这是解释前的Phalcon项目。 https://github.com/phalcon/phalcon-devtools/tree/master/templates/project/modules

路由

https://github.com/phalcon/phalcon-devtools/blob/master/templates/project/modules/routes.php

$router = $di->get("router");

foreach ($application->getModules() as $key => $module) {
    $namespace = str_replace('Module','Controllers', $module["className"]);
    $router->add('/'.$key.'/:params', array(
        'namespace' => $namespace,
        'module' => $key,
        'controller' => 'index',
        'action' => 'index',
        'params' => 1
    ))->setName($key);
    $router->add('/'.$key.'/:controller/:params', array(
        'namespace' => $namespace,
        'module' => $key,
        'controller' => 1,
        'action' => 'index',
        'params' => 2
    ));
    $router->add('/'.$key.'/:controller/:action/:params', array(
        'namespace' => $namespace,
        'module' => $key,
        'controller' => 1,
        'action' => 2,
        'params' => 3
    ));
}

模块注册

https://github.com/phalcon/phalcon-devtools/blob/master/templates/project/modules/modules.php

$application->registerModules(array(
    'module1' => array(
        'className' => 'Project\Module1\Module',
        'path' => __DIR__ . '/../apps/module1/Module.php'
    ),
    'module2' => array(
        'className' => 'Project\Module2\Module',
        'path' => __DIR__ . '/../apps/module2/Module.php'
    )
));

服务

https://github.com/phalcon/phalcon-devtools/blob/master/templates/project/modules/services.php

$di->set('router', function () {
$router = new Router();

$router->setDefaultModule('module1');
$router->setDefaultNamespace('Project\Module1\Controllers');

 return $router;
});

Phalcon提供的一个例子。这与Phalcon Tools实现并不完全相同。

https://github.com/phalcon/mvc/tree/master/multiple-factory-default

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

我在app\config\routes.php中定义了我的常规路由然后在app\config\routes中我为每个组(在本例中为模块)都有一个文件。

应用\设置\ routes.php文件

<?php
$router = new \Phalcon\Mvc\Router();

$router->setDefaultModule("frontend");

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

foreach (glob(__DIR__ . "/routes/*.php") as $filename) {
    include $filename;
}

$router->removeExtraSlashes(true);

return $router;

管理\设置\路由\ admin.php的

<?php

use Phalcon\Mvc\Router\Group;

//Create a group with a common module and controller
$admin = new Group(array('module' => 'admin'));

$admin->setPrefix('/admin');

$admin->add("", array(
    'controller' => 'index',
    'action' => 'index'
));

$admin->add("/foo", array(
    'controller' => 'foo',
    'action' => 'index'
));

$admin->add("/bar", array(
    'controller' => 'bar',
    'action' => 'index'
));

$router->mount($admin);

我只需要定义控制器和索引,因为任何其他操作都将成为URL的一部分,并且应该自行路由。

修改

<强>的index.php

/*
 * ... includes
 */

$application = new \Phalcon\Mvc\Application($di);

$application->registerModules(array(
    'admin' => array(
        'className' => 'Calmsplash\App\Admin',
        'path' => '../app/admin/Admin.php',
    ),
    'frontend' => array(
        'className' => 'Calmsplash\App\Frontend',
        'path' => '../app/frontend/Frontend.php',
    ),
    /// ... more modules
));

我在模块名称之后调用了我的Module文件,只是为了使它们适合命名空间。