Phalcon 1.2.6:$ dispatcher-> getControllerName()没有返回字符串?

时间:2014-02-13 22:58:37

标签: php phalcon

情况:

我有两个环境:我的本地开发机器(Dev),以及带有Media Temple(Prod)的生产服务器。我已经在两者上安装了Phalcon。 Dev似乎成功运行了一个非常基本的(1控制器)Phalcon站点。但是,Prod遇到了相同代码的问题。

问题:

我正在尝试将非camelcased控制器和操作转换为有效的camelcased控制器(例如“test-page”到“testPage”)。这是开发Dev而不是Prod。我在Prod上收到的错误是:

Warning: Invalid arguments supplied for camelize()

使用以下代码(full gist):

$eventsManager->attach('dispatch', function ($event, $dispatcher) {
      $controllerName = Phalcon\Text::camelize($dispatcher->getControllerName()); // Throwing an error here...
      $dispatcher->setControllerName($controllerName);

      $actionName = Phalcon\Text::camelize($dispatcher->getActionName()); // ... and here
      $dispatcher->setActionName($actionName);
});

查看https://github.com/phalcon/cphalcon/blob/master/ext/kernel/string.c#L225,当值不是字符串时,看起来camelize()函数会返回此错误。

问题:

所以这意味着$ dispatcher-> getControllerName()没有返回字符串?

为什么会这样?什么会导致这个函数返回不同的类型?

服务器信息:

DEV:  Apache 2.2.22 / PHP 5.3.13 Win7
PROD: Apache 2.2.22 / PHP 5.3.27 Linux

2 个答案:

答案 0 :(得分:0)

奇怪的是,它不会返回字符串。它应该:/

试试这个:

$controllerName = Phalcon\Text::camelize((string) $dispatcher->getControllerName()); // 

也尝试倾销那里发生的事情:

var_dump($dispatcher->getControllerName());

如果它返回null / false或其他一些东西,你可以简单地将用户重定向到某个地方:

$this->view->disable(); // for flash messages to keep in session (if you use some)
$this->response->redirect($this->url->get("user/index"), true); // true for external redirect
return; // stop doing anything

也许你的路由器做了一些错误的事情?用它做过什么?有办法定义当前控制器..

你可以试试这个:

$paths = $this->router->getMatchedRoute()->getPaths();
var_dump($paths);

也可以在你的路由器中添加:

$router->add('/:controller[/]{0,1}', array(
    'controller' => 1,
    'action' => 'index'
));

或采取行动:

$router->add('/:controller/:action[/]{0,1}', array(
    'controller' => 1,
    'action' => 2,
));

答案 1 :(得分:0)

我认为你应该对dispatch:beforeDispatch事件作出反应,而不是对所有dispatch事件做出反应。

调度员发送的第一个事件是dispatch:beforeDispatchLoop,根据documentation,此事件是......

  

在进入调度循环之前触发。此时此刻   调度员不知道控制器或要执行的动作   存在。 Dispatcher只知道路由器传递的信息

因此,如果路由器未找到URL的完全匹配(这不是错误,因为稍后将应用默认设置),控制器名称将为null