Phalcon多模块路由[英] Phalcon Multi-Module Routing

问题描述

我正在尝试使用 Phalcon PHP 框架的多模块配置.

我遇到了与路由相关的问题,因为我的模块之一无法通过 url 访问.似乎每次我尝试访问定义的模块 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 工具的实现.

https://github.com/phalcon/mvc/tree/主/多工厂默认

非常感谢任何帮助.

推荐答案

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

app\config\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\config\routes\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 文件,只是为了让它们适合命名空间.

本文地址:https://www.itbaoku.cn/post/1739762.html