2016-03-23 28 views
0

私は私のACLのコンフィグを保存するためにXMLを使用して、ロールに&リソースを解析するためにZend ACLライブラリを拡張し、その作業偉大います。Zend Frameworkの2、

以下は私のACL.XML

<?xml version="1.0" encoding="UTF-8"?> 
<permissions> 
    <roles> 
     <role name="guest" /> 
     <role name="user" inherits="guest" /> 
     <role name="admin" inherits="user" /> 
    </roles> 
    <resources> 
     <module name="account" allow="user"> 
      <controller name="account\controller\account" allow="user"> 
       <action name="login" deny="admin" /> 
      </controller> 
     </module> 
     <module name="album" allow="user"> 
      <controller name="album\controller\album" allow="user"> 
       <action name="index" allow="user" /> 
       <action name="add" allow="admin" /> 
      </controller> 
     </module> 
     <module name="application" allow="user"> 
      <controller name="application\controller\index" allow="user"> 
       <action name="index" allow="user" /> 
      </controller> 
     </module> 
    </resources> 
</permissions> 

、現在MvcEvent::EVENT_DISPATCHイベントを経由して呼ばれている私のModule.phpコード、私は(サービスマネージャから)私のACLクラスをキャッシュするにはどうすればよい

$serviceManager = $event->getApplication()->getServiceManager(); 

    $configCache = simplexml_load_file(__DIR__.'/config/acl.xml'); 

    $serviceManager->get('memcache')->setItem('cacheXml', $configCache); 

    //print_r($serviceManager->get('memcache')->getItem('cacheXml')); 

    $this->_acl  = $serviceManager->get('Acl'); 

    $this->_acl->initAcl($configCache); 

    if (! $this->_acl->_isAllowed('user', $event->getRouteMatch())) { 
       $url = $event->getRouter()->assemble(array('action' => 'index'), array('name' => 'application')); 
       $response = $event->getResponse(); 
       $response->getHeaders()->addHeaderLine('Location', $url); 
       $response->setStatusCode(302); 
       $response->sendHeaders(); 
       exit; 
    } else { 
     echo 'Access granted :) '; 
    } 

またはその他でありますコードがより永続的かつ最適化されるようにすることを意味します。私のcachingmemcacheを使用しています。

答えて

1

私のアプローチは、ZendAclFactoryを作成し、そこからインスタンスを作成したり、キャッシュから返すことです。

<?php 

namespace MyNamespace\Acl; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 
use Zend\Permissions\Acl\Acl as ZendAcl; 
use Zend\Permissions\Acl\Resource\GenericResource; 
use Zend\Permissions\Acl\Role\GenericRole as Role; 

class ZendAclFactory implements FactoryInterface 
{ 
    private $cache; 

    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $this->cache = $serviceLocator->get('MyCache'); 
     $service = $this->cache->getItem('acl'); 
     if (!empty($service)) { 
      $service = unserialize($service); 
      return $service; 
     } 

     $service = new ZendAcl(); 
     //initialize you acl here.. 

     $this->cache->addItem('acl', serialize($service)); 
     return $service; 
    } 
} 
+0

私は今memcacheとそのうまく動作しているACLをキャッシュしていますが、私のアプローチをポストしています。あなたも試してみてください –

関連する問題