我以前遇到过这个......问题是C5的Request对象直到在各种包控制器的on_start事件被触发之后才被初始化。我相信人们想出的唯一解决方案是在包控制器的 on_start 函数中自己手动初始化 Request 类。如果您查看 dispatcher.php 文件,您将在第 129 行(在 Concrete5.6.0.1 中)看到以下代码块:
// figure out where we need to go
$req = Request::get();
if ($req->getRequestCollectionPath() != '') {
if (ENABLE_LEGACY_CONTROLLER_URLS) {
$c = Page::getByPath($req->getRequestCollectionPath(), 'ACTIVE');
} else {
$c = $req->getRequestedPage();
}
} else {
$c = Page::getByID($req->getRequestCollectionID(), 'ACTIVE');
}
$req = Request::get();
$req->setCurrentPage($c);
if ($c->isError()) {
// if we've gotten an error getting information about this particular collection
// than we load up the Content class, and get prepared to fire away
switch($c->getError()) {
case COLLECTION_NOT_FOUND:
$v = View::getInstance();
$v->render('/page_not_found');
break;
}
}
...所以我认为您可以将所有内容复制到包控制器的 on_start 函数中,然后您就$req
可以从中获取路径信息和变量的对象。
注意:我从 Concrete5.6.0.1 复制了该代码。如果您使用的是不同版本的系统,则不应只使用我上面粘贴的内容,而应自己从/concrete/dispatcher.php
文件中复制相应的代码