Phalcon路由器对子文件夹和命名空间声明没有反应[英] Phalcon router doesn't react to subfolders and namespace declaration

问题描述

所以我一直在阅读大量的 stackoverflow 和 phalcon 论坛帖子..(我开始讨厌这个框架),但似乎没有任何效果,也无法解释为什么像 Laravel 那样做.

我只是想能够使用这个应用程序结构进行操作:

在此处输入图片描述

如您所见,我想要的只是在子文件夹中使用命名空间控制器来为我的代码创建更多顺序.

根据所有的解释,这是我的loader.php:

<?php

$loader = new \Phalcon\Loader();

/**
 * We're a registering a set of directories taken from the configuration file
 */
$loader->registerDirs(
    array(
        $config->application->controllersDir,
        $config->application->modelsDir,
        $config->application->pluginsDir
    )
)->register();

AFAIK,当通过 registerDirs 使用时,Phalcon 应该遍历所有子文件夹以查找未找到的类.

然后我在基目录中索引控制器的主路由之后定义我到特定控制器的路由:

<?php

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

$router->add('/:controller/:action/:params', array(
    'namespace' => 'App\Controllers',
    'controller' => 1,
    'action' => 2,
    'params' => 3,
));

$router->add('/:controller', array(
    'namespace' => 'App\Controllers',
    'controller' => 1
));

$router->add('/soccer/soccer/:controller', array(
    'namespace' => 'App\Controllers\Soccer',
    'controller' => 1
));

$router->add('/soccer/:controller/:action/:params', array(
    'namespace' => 'App\Controllers\Soccer',
    'controller' => 1,
    'action' => 2,
    'params' => 3
));

return $router;

我的一个控制器看起来像:

<?php  namespace App\Controllers\Soccer;

use App\Controllers\ControllerBase as ControllerBase;

class IndexController extends ControllerBase
{

    public function indexAction()
    {

    }

}

这里有什么问题?默认顶级命名空间未注册?我错过了什么吗?

这行不通.当我尝试打开我希望转到 app/controllers/soccer/IndexController.php 的 myserver.com/soccer 时,它却告诉我:

<块引用>

SoccerController 处理程序类无法加载

这基本上意味着它在/controllers 目录中寻找 SoccerController.php 并且完全忽略了我的子文件夹定义和路由.

法尔康 1.3.0

坚持了一周.任何帮助 - 非常感谢.

推荐答案

我在使用命名空间加载 ControllerBase 和控制器文件夹中的其余控制器时遇到问题.我遇到了困难,因为其他示例项目运行良好,我意识到我在调度程序声明中遗漏了一个小细节,我应该 setDefaultNamespace

(参考:https://github.com/phalcon/vokuro/blob/master/app/config/services.php)

$di->set('dispatcher', function () {

    $dispatcher = new Dispatcher();

    $dispatcher->setDefaultNamespace('App\Controllers');

    return $dispatcher;
});

或者你可以像这样直接在路由声明文件中指定它

$router->add("/some-controler", array(
    'namespace' => 'App\Controllers'
    'controller' => 'some',
    'action' => 'index'
));

这应该也可以,一开始可能会有点混淆命名空间,但是一旦你掌握了它,你就会喜欢这个极快的框架

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