Php 如何在控制器插件中从Zend_导航检索当前页面
我正在使用控制器插件开发一个身份验证插件。我在application.ini文件中定义导航配置,然后使用该配置和数据库用户记录动态加载ACL并将其应用于Zend_导航。此位起作用,因为它成功加载菜单并仅显示允许用户查看的页面 然而,这并不能阻止用户直接进入页面。我想做的是识别用户何时进入控制器插件中他们无权访问的页面,这样我就可以将他们的请求重定向到身份验证页面 我想一定有一个函数可以从Zend_Navigation检索当前页面,但我找不到它。。。所以也许它不存在 无论如何,这是我的完整控制器插件。有人看到解决办法了吗Php 如何在控制器插件中从Zend_导航检索当前页面,php,zend-framework,zend-navigation,zend-acl,Php,Zend Framework,Zend Navigation,Zend Acl,我正在使用控制器插件开发一个身份验证插件。我在application.ini文件中定义导航配置,然后使用该配置和数据库用户记录动态加载ACL并将其应用于Zend_导航。此位起作用,因为它成功加载菜单并仅显示允许用户查看的页面 然而,这并不能阻止用户直接进入页面。我想做的是识别用户何时进入控制器插件中他们无权访问的页面,这样我就可以将他们的请求重定向到身份验证页面 我想一定有一个函数可以从Zend_Navigation检索当前页面,但我找不到它。。。所以也许它不存在 无论如何,这是我的完整控制器插
<?php
class Pog_Model_AuthPlugin extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $oRequest)
{
/**
* Load user
*/
$oAuth = Zend_Auth::getInstance();
$oDbUsers = new Pog_Model_DbTable_Users();
if (!$oAuth->hasIdentity())
{
$oUser = $oDbUsers->createRow();
$oUser->name = "guest";
$oUser->setReadOnly(true);
}
else
{
$oUser = $oAuth->getIdentity();
$oUser->setTable($oDbUsers);
}
/**
* Load ACL
*/
$oAcl = new Zend_Acl();
$oAcl->addRole($oUser->name);
/**
* Add current user privileges
*/
$oPrivileges = $oUser->getPrivileges();
foreach ($oPrivileges as $oPrivilege)
{
if (!$oAcl->has($oPrivilege->resource))
$oAcl->addResource($oPrivilege->resource);
$oAcl->allow($oUser->name, $oPrivilege->resource, $oPrivilege->privilege);
}
/**
* Load Navigation view helper
*/
$oViewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
$oNavigation = $oViewRenderer->view->navigation();
/**
* Add remaining Navigation resources
*/
foreach ($oNavigation->getPages() as $oPage)
{
if (!is_null($oPage->getResource()) && !$oAcl->has($oPage->getResource()))
$oAcl->addResource($oPage->getResource());
}
/**
* Set ACL and Role
*/
$oNavigation->setAcl($oAcl)->setRole($oUser->name);
/**
* Check if use is allowed to be here
*/
...MAGIC GOES HERE...
}
}
我认为您应该能够获得如下当前导航页面:
/**
* Load Navigation view helper
*/
$oViewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
$oNavigation = $oViewRenderer->view->navigation();
/*@var $active array */
$active = $oNavigation->findActive($oNavigation->getContainer());
/*@var $activePage Zend_Navigation_Page_Mvc */
$activePage = $active['page'];
// example of getting page info
var_dump($activePage->getLabel(), $activePage->getController(), $activePage->getAction());
希望这能有所帮助。我认为您应该能够获得当前导航页面,如下所示:
/**
* Load Navigation view helper
*/
$oViewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
$oNavigation = $oViewRenderer->view->navigation();
/*@var $active array */
$active = $oNavigation->findActive($oNavigation->getContainer());
/*@var $activePage Zend_Navigation_Page_Mvc */
$activePage = $active['page'];
// example of getting page info
var_dump($activePage->getLabel(), $activePage->getController(), $activePage->getAction());
希望这有帮助。这是我使用的解决方案,因为我无法让Marcin的解决方案在我的设置中工作,因为某些原因
我做了更多的思考,想出了一个简单的解决问题的好办法。我没有使用导航模块查找活动页面,而是自己查找。因为我已经遍历了这些页面,比较控制器和操作是小菜一碟——如果两者都匹配,我就有了我的活动页面
新的getPages()foreach循环如下所示:
$oCurrentPage = null;
foreach ($oNavigation->getPages() as $oPage)
{
/**
* Check for Current Page
*/
if ($oPage->getController() == $oRequest->getControllerName()
&& $oPage->getAction() == $oRequest->getActionName())
$oCurrentPage = $oPage;
/**
* Add Resource, if missing
*/
if (!is_null($oPage->getResource()) && !$oAcl->has($oPage->getResource()))
$oAcl->addResource($oPage->getResource());
}
这是我使用的解决方案,因为由于某种原因,我无法让Marcin的解决方案在我的设置中工作
我做了更多的思考,想出了一个简单的解决问题的好办法。我没有使用导航模块查找活动页面,而是自己查找。因为我已经遍历了这些页面,比较控制器和操作是小菜一碟——如果两者都匹配,我就有了我的活动页面
新的getPages()foreach循环如下所示:
$oCurrentPage = null;
foreach ($oNavigation->getPages() as $oPage)
{
/**
* Check for Current Page
*/
if ($oPage->getController() == $oRequest->getControllerName()
&& $oPage->getAction() == $oRequest->getActionName())
$oCurrentPage = $oPage;
/**
* Add Resource, if missing
*/
if (!is_null($oPage->getResource()) && !$oAcl->has($oPage->getResource()))
$oAcl->addResource($oPage->getResource());
}
这看起来像是我想要的,但我得到了一个空数组作为响应。这可能与我在控制器插件中运行它有关吗?我只是在视图脚本中放了一些测试代码,上面的工作正常。当我在控制器插件中找到导航助手时,它看起来并没有完全设置好,但在那之后就没事了。。。现在看看它什么时候被设置好,看我是否能触发它。@Valorin。我在我的acl控制器插件的preDispatch中测试了代码,它是正常的。如何设置导航?我在bootstrap.php中设置了导航?也许在我的例子中是这样初始化的?@Marcin,我使用导航资源在application.ini文件中设置了导航,所以可能就是这样。不过,如果是这样的话,那就有点奇怪了。导航代码似乎通过前控制器拉动活动控制器和操作-所以我认为这还没有设置。@Valorin。这是我在bootstrap.php中初始化nav的方式:。也许这会有帮助。这看起来像我想要的,但我得到一个空数组作为响应。这可能与我在控制器插件中运行它有关吗?我只是在视图脚本中放了一些测试代码,上面的工作正常。当我在控制器插件中找到导航助手时,它看起来并没有完全设置好,但在那之后就没事了。。。现在看看它什么时候被设置好,看我是否能触发它。@Valorin。我在我的acl控制器插件的preDispatch中测试了代码,它是正常的。如何设置导航?我在bootstrap.php中设置了导航?也许在我的例子中是这样初始化的?@Marcin,我使用导航资源在application.ini文件中设置了导航,所以可能就是这样。不过,如果是这样的话,那就有点奇怪了。导航代码似乎通过前控制器拉动活动控制器和操作-所以我认为这还没有设置。@Valorin。这是我在bootstrap.php中初始化nav的方式:。也许这会有帮助。