2014-01-14 65 views

回答

0

有幾種方法可以做到這一點...見下文。

我認爲最好的方法是使用ACL MVC規則 - 爲您的應用程序增加安全性,並可用於檢查資源(模型/控制器/操作)是否存在。

選項1

建設類名,並得到它的方法,看看您的行爲存在。無論是使用get_class_methodsReflectionClass::getMethods

/** 
* @param string $controller name of controller e.g. "index" 
* @param string $action name of action e.g. "index", "myAction" 
* @param string $module (optional) name of the current module 
* @return boolean 
*/ 
protected function _isControllerAction($controller, $action, $module = '') 
{ 
    $module = ($module == 'default') ? '' : $module; 
    $class = ucfirst($module) . ucfirst($controller) . 'Controller'; 
    $methods = get_class_methods($class); 
    return in_array("{$action}Action", $methods); 
} 

選項2

您可以檢查模塊/控制器的分派。這不會檢查請求中的操作和混亂情況!如果你這樣做,然後添加額外的代碼來恢復請求狀態。

protected function isDispatchableController() 
{ 
    $this->getRequest() 
      ->setModuleName('default') 
      ->setControllerName('index'); 

    $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher(); 

    /* @var $dispatcher Zend_Controller_Dispatcher_Standard */ 
    return $dispatcher->isDispatchable($this->getRequest()); 
} 

選項3

技術上你可以跳過這一切的檢查和落實默認ErrorHandler,讓它重定向到ErrorController ......然後添加特殊處理404

選項4

如果您使用ACL,您可以檢查資源是否存在,並且用戶是否有權訪問它。 這裏是好文章Zend ACL MVC Integration

0

如果你使用的是Zend Framework 2,這很簡單。

假設我們要檢查URI是否與註冊路由器相匹配,並重定向用戶,如果這與當前url不同。

$goto = 'http://www.mysite.tld/admin'; 

$request = $this->getRequest(); 
$request->setUri($goto); 

if ($routeToBeMatched = $this->getServiceLocator()->get('Router')->match($request)) { 
    $currentRouteMatchName = $this->getEvent()->getRouteMatch()->getMatchedRouteName(); 
    if ($routeToBeMatched->getMatchedRouteName() != $currentRouteMatchName) { 
     return $this->redirect()->toRoute($goto); 
    } 
} 
相關問題