2013-12-17 5 views
5

मैं जेडएफ 2 के लिए नया हूं और सामानों को कैसे करना है इसका उपयोग नहीं किया जाता है। मैं किसी उपयोगकर्ता का ट्रैक रखने के लिए सत्र का उपयोग करना चाहता हूं (मुझे याद रखें)। मेरे पास यह वर्ग मेरी कक्षा के एक हिस्से में था:जेडएफ 2 सत्र प्रबंधक उपयोग

$sessionManager = new \Zend\Session\SessionManager(); 
$sessionManager->rememberMe($time); 

// i want to keep track of my user id too 
$populateStorage = array('user_id' => $user->getId()); 
$storage = new ArrayStorage($populateStorage); 
$sessionManager->setStorage($storage); 

ठीक है, अब तक इतना अच्छा है। जब मैं कोशिश करता हूं:

var_dump($sessionManager->getStorage()); 

मुझे अपेक्षित डेटा मिलता है।

$sessionManager = new \Zend\Session\SessionManager(); 
var_dump($sessionManager->getStorage()); 

यह केवल एक खाली ऑब्जेक्ट:

मेरा कार्यक्रम के दूसरे भाग में, मैं अपने डेटा को फिर से (कंटेनर की तरह एक बिट) पुनर्प्राप्त करना चाहते हैं। मुझे लगता है कि यह "नया" के कारण है और मुझे लगता है कि मुझे सत्र प्रबंधक को एक अलग तरीके से कार्यान्वित करना है, लेकिन कैसे? मुझे नहीं पता।

मेरी मॉड्यूल में अब मेरे पास है:

public function onBootstrap(\Zend\Mvc\MvcEvent $e) 
{ 
    $config = $e->getApplication() 
      ->getServiceManager() 
      ->get('Configuration'); 

    $sessionConfig = new SessionConfig(); 
    $sessionConfig->setOptions($config['session']); 
    $sessionManager = new SessionManager($sessionConfig); 
    $sessionManager->start(); 

मेरी module.config में:

'session' => array(
    'remember_me_seconds' => 2419200, 
    'use_cookies' => true, 
    'cookie_httponly' => true, 
), 

लेकिन यह कैसे बढ़ना यह क्या मैं के साथ आया है? मैं अपने सत्र प्रबंधक के लिए उदाहरण कैसे प्राप्त करूं?

उत्तर

12

अच्छी तरह से प्रलेखित सत्र प्रबंधक नहीं है (zf2 api doc) और सत्र कॉनफिग फैक्ट्री (zf2 api doc)।

'service_manager' => [ 
    'factories' => [ 
     'Zend\Session\SessionManager' => 'Zend\Session\Service\SessionManagerFactory', 
     'Zend\Session\Config\ConfigInterface' => 'Zend\Session\Service\SessionConfigFactory', 
    ], 
], 

और विन्यास अपने सत्र के लिए विकल्पों में कहें, session_config कुंजी के अंतर्गत मॉड्यूल:

'session_config' => [ 
    'remember_me_seconds' => 2419200, 
    'use_cookies' => true, 
    'cookie_httponly' => true, 
], 

और बस हो गया, अब उन के साथ का दृष्टांत SessionManager बहुत आसान है, बस अपने ServiceManager विन्यास करने के लिए इन कारखानों डाल है आप नियंत्रक में कहीं भी सेवा लोकेटर से SessionManager प्राप्त कर सकते हैं, उदाहरण के लिए:

/** @var Zend\Session\SessionManager $sm */ 
$sessionManager = $this->serviceLocator->get('Zend\Session\SessionManager'); 

यह Zend फ्रेमवर्क का 2.2 संस्करण के रूप में उपलब्ध है (related pull request)।

+0

बढ़िया है, यह बहुत ही उपयोगी सेवा देखा नहीं था! – razor7

+2

यह बहुत दुर्भाग्यपूर्ण है कि ज़ेंड 2 में कोई उचित दस्तावेज नहीं है। ऐसा लगता है कि ज़ेंड 2 उन लोगों के लिए है जो इसे विकसित करते हैं। – kta

1

मेरी परियोजना में मैं अन्य स्रोत (पुस्तक या आधिकारिक दस्तावेज़ीकरण, भूल) से उदाहरण का उपयोग करता हूं।

मुख्य Module.php फ़ाइल:

namespace Application; 

class Module 
{ 
    public function getServiceConfig() 
    { 
     return array(
      'factories' => array(
       'Zend\Session\SessionManager' => function ($sm){ 
        $config = $sm->get('config'); 
        if (isset($config['session'])){ 
         $session_config = $config['session']; 

         $sessionConfig = null; 
         if (isset($session_config['config'])){ 
          $class = isset($session_config['config']['class']) 
           ? $session_config['config']['class'] 
           : 'Zend\Session\Config\SessionConfig'; 
          $options = isset($session_config['config']['options']) 
           ? $session_config['config']['options'] 
           : array(); 
          $sessionConfig = new $class(); 
          $sessionConfig->setOptions($options); 
         } 

         $sessionStorage = null; 
         if (isset($session_config['storage'])){ 
          $class = $session_config['storage']; 
          $sessionStorage = new $class(); 
         } 

         $sessionSaveHandler = null; 
         if (isset($session_config['save_handler'])){ 
          // class should be fetched from service manager 
          // since it will require constructor arguments 
          $sessionSaveHandler = $sm->get($session_config['save_handler']); 
         } 

         $sessionManager = new SessionManager(
          $sessionConfig, 
          $sessionStorage, 
          $sessionSaveHandler 
         ); 

         if (isset($session_config['validator'])){ 
          $chain = $sessionManager->getValidatorChain(); 
          foreach ($session_config['validator'] as $validator){ 
           $validator = new $validator(); 
           $chain->attach('session.validate', array(
            $validator, 
            'isValid' 
           )); 
          } 
         } 
        } else { 
         $sessionManager = new SessionManager(); 
        } 
        Container::setDefaultManager($sessionManager); 
        return $sessionManager; 
       }, 
      ), 
     ); 
    } 
} 

मेरे config/autoload/global.php कॉन्फ़िग फ़ाइल:

return array(
    'session' => array(
     'config' => array(
      'class' => 'Zend\Session\Config\SessionConfig', 
      'options' => array(
       'use_cookies' => true, 
      ), 
     ), 
     'storage' => 'Zend\Session\Storage\SessionArrayStorage', 
     'validators' => array(
      array(
       'Zend\Session\Validator\RemoteAddr', 
       'Zend\Session\Validator\HttpUserAgent', 
      ), 
     ), 
    ), 
); 

सत्र से user_id पाने के लिए:

$sessionStorage = $sm->get('Zend\Session\SessionManager') 
    ->getStorage(); 
$user_id = $sessionStorage->user_id; 
संबंधित मुद्दे