情况:
我有两个环境:我的本地开发机器(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
答案 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
。