Phalcon路由器不响应子文件夹和名称空间声明

时间:2014-03-30 12:00:17

标签: php phalcon phalcon-routing

所以我一直在阅读大量的stackoverflow和phalcon论坛帖子......(我开始讨厌这个框架),但似乎没有什么工作,也没有解释为什么像Laravel例如。

我只是想尝试使用这种应用程序结构:

enter image description here

正如您所看到的,我只想在子文件夹中使用命名空间控制器来为我的代码添加更多顺序。

根据所有解释,这里是我的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()
    {

    }

}

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

这不起作用。当我尝试打开myserver.com/soccer时,我希望转到app / controllers / soccer / IndexController.php,但它会告诉我:

  

无法加载SoccerController处理程序类

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

Phalcon 1.3.0

坚持了一个星期。任何帮助 - 非常感谢。

3 个答案:

答案 0 :(得分:4)

我在使用命名空间加载ControllerBase和控制器文件夹中的其他控制器时出现问题。我很难过,因为其他示例项目工作正常,我意识到我在despatcher声明中遗漏了一个小细节,我应该 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'
));

它应该也可以工作,起初可能有点令人困惑,但是一旦掌握了它,你就会喜欢这个非常快速的框架

答案 1 :(得分:2)

看起来您的名称空间有大写

  

应用\控制器\足球

并且您的文件夹结构不是

  

应用\控制器\足球

在我的应用程序中,我有带命名空间的控制器,我刚刚尝试更改文件夹的大小写,因此它们不匹配,我得到了缺少的类错误。

当然它确实提出了一个问题,你有多少控制器计划让它们的命名空间值得?您是按功能或内容对控制器和操作进行分组吗?我曾经在Zend中拥有大量的控制器,但现在我按功能对它们进行了分组我只有16个而且我更开心。例如我怀疑足球,橄榄球,曲棍球等可能会分享运动控制器,文章,联赛位置等都会有很多共同的数据。

ps不要放弃Phalcon!根据我的经验,它比我使用它的任何其他PHP框架快得多,值得花很多钱:)

答案 2 :(得分:1)

在将目录注册到自动加载器时,您确定Phalcon遍历子文件夹吗?您是否尝试在自动加载器中添加一行显式加载controllers\soccer目录?

或者,如果您的足球控制器是命名空间,您还可以使用自动加载器注册命名空间:"App\Controllers\Soccer" => "controllers/soccer/"