1

所以我一直在阅读大量的 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

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

4

3 回答 3

5

I was having a problem with loading the ControllerBase and the rest of the controllers in the controllers folder using namespaces. I was having a hard time since other example projects worked fine and I realized that I was missing a small detail in the despatcher declaration where I was supposed to setDefaultNamespace

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

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

    $dispatcher = new Dispatcher();

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

    return $dispatcher;
});

or you can specify it directly on the routing declaration file like this

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

that should work as well, it might be a bit confusing at first with namespaces but once you get a hang of it you will love this extremely fast framework

于 2014-04-15T22:09:24.123 回答
2

看起来您的命名空间有大写字母

应用\控制器\足球

并且您的文件夹结构没有

应用程序\控制器\足球

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

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

ps 不要放弃 Phalcon!以我的经验,它比我使用过的任何其他 PHP 框架都快得多,值得忍受很多:)

于 2014-04-08T15:45:18.113 回答
1

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

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

于 2014-03-31T05:55:41.457 回答