我试图使用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
非常感谢任何帮助。
答案 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
文件,只是为了使它们适合命名空间。