2017-04-11 121 views
1

我在ZF2中登录和注销系统。我想在登录时显示登录用户的用户名。屏幕截图如下: enter image description here显示zf2中登录用户的用户名

我有不同的意见,如view/provinces/index.phtml,view/districts/index.phtml,等

我有view/layout/layout.phtml中的layout.phtml,其中我描述了每个视图的管理布局。所以有必要在layout.phtml中访问登录用户的用户名。

我也喜欢相应控制器/ ProvincesController.php,控制器/ DistrictsController.php等控制器我可以访问用户名登录用户在控制器/ ProvincesController.php等由代码:

public function getAuthService() 
{ 
    $this->authservice = $this->getServiceLocator()->get('AuthService'); 
    return $this->authservice; 
} 

$username = $this->getAuthService()->getStorage()->read(); 

但我无法访问layout.phtml中登录用户的用户名的值。

所以,如果有人知道它或有简单的想法或实践,那么请让我知道。

Module.php:

<?php 

namespace Admin; 

use Admin\Model\Profile; 
use Admin\Model\ProfileTable; 

use Admin\Model\Provinces; 
use Admin\Model\ProvincesTable; 

use Admin\Model\Districts; 
use Admin\Model\DistrictsTable; 

use Admin\Model\User; 
use Admin\Model\UserTable; 

use Zend\Db\ResultSet\ResultSet; 
use Zend\Db\TableGateway\TableGateway; 

use Zend\Mvc\ModuleRouteListener; 
use Zend\Mvc\MvcEvent; 

use Zend\ModuleManager\Feature\AutoloaderProviderInterface; 

use Zend\Authentication\Adapter\DbTable as DbTableAuthAdapter; 
use Zend\Authentication\AuthenticationService; 

class Module implements AutoloaderProviderInterface 
//class Module 
{ 

public function getConfig() 
{ 
    return include __DIR__ . '/config/module.config.php'; 
} 

public function getServiceConfig() 
{ 
    return array(
     'abstract_factories' => array(), 
     'aliases' => array(), 

     'factories' => array( 

     // SERVICES 
      'AuthService' => function($sm) { 
      $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
      $dbTableAuthAdapter = new DbTableAuthAdapter($dbAdapter, 'user','username','password', 'MD5(?)'); 

      $authService = new AuthenticationService(); 
      $authService->setAdapter($dbTableAuthAdapter); 
      return $authService; 
      },  

      // DB 
      'UserTable' => function($sm) { 
      $tableGateway = $sm->get('UserTableGateway'); 
      $table = new UserTable($tableGateway); 
      return $table; 
      }, 
      'UserTableGateway' => function ($sm) { 
      $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
      $resultSetPrototype = new ResultSet(); 
      $resultSetPrototype->setArrayObjectPrototype(new User()); 
      return new TableGateway('user', $dbAdapter, null, 
      $resultSetPrototype); 
      }, 

      // FORMS 
      'LoginForm' => function ($sm) { 
      $form = new \Admin\Form\LoginForm(); 
      $form->setInputFilter($sm->get('LoginFilter')); 
      return $form; 
      }, 


      // FILTERS 
      'LoginFilter' => function ($sm) { 
      return new \Admin\Form\LoginFilter(); 
      }, 


      'Admin\Model\ProvincesTable' => function($sm) { 
       $tableGateway = $sm->get('ProvincesTableGateway'); 
       $table = new ProvincesTable($tableGateway); 
       return $table; 
      }, 
      'ProvincesTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Provinces()); 
       return new TableGateway('provinces', $dbAdapter, null, $resultSetPrototype); 
      }, 

      'Admin\Model\DistrictsTable' => function($sm) { 
       $tableGateway = $sm->get('DistrictsTableGateway'); 
       $table = new DistrictsTable($tableGateway); 
       return $table; 
      }, 
      'DistrictsTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Districts()); 
       return new TableGateway('districts', $dbAdapter, null, $resultSetPrototype); 
      }, 



     ), 

     'invokables' => array(), 
     'services' => array(), 
     'shared' => array(), 

    ); 
} 

public function getAutoloaderConfig() 
{ 
    return array( 
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
     // if we're in a namespace deeper than one level we need to fix the \ in the path 
       __NAMESPACE__ => __DIR__ . '/src/' . str_replace('\\', '/' , __NAMESPACE__), 
      ), 
     ), 
    ); 
} 

} 

在此先感谢。

+0

您使用什么模块进行身份验证?你自己?或外部模块? – SzymonM

+0

我有我自己的模块。 – Skylink

回答

2

推荐的方法是使用identityhttps://framework.zend.com/manual/2.4/en/modules/zend.view.helpers.identity.html)查看帮手。然后在任意视图模型,你可以用它如下:

if ($user = $this->identity()) { 
    echo 'Logged in as ' . $this->escapeHtml($user->getUsername()); 
} else { 
    echo 'Not logged in'; 
} 

为了使其工作,你必须在特定的名字 - Zend\Authentication\AuthenticationService注册您的认证服务。

因此,在你module.config.php文件,添加到service_manager

'service_manager' => array(
    'aliases' => array(
     'Zend\Authentication\AuthenticationService' => 'AuthService', // <--- this line 
    ), 
    'invokables' => array(
     'AuthService' => 'Your\Authentication\Class', 
    ), 
), 

那么你应该能够使用identity控制器插件和视图助手。

在你的情况,Module.php应该是这样的:

... 
public function getServiceConfig() 
{ 
    return array(
     'abstract_factories' => array(), 
     'aliases' => array(
      'Zend\Authentication\AuthenticationService' => 'AuthService', // <--- this line 
     ), 

     'factories' => array( 

     // SERVICES 
      'AuthService' => function($sm) { 
      $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
      $dbTableAuthAdapter = new DbTableAuthAdapter($dbAdapter, 'user','username','password', 'MD5(?)'); 

      $authService = new AuthenticationService(); 
      $authService->setAdapter($dbTableAuthAdapter); 
      return $authService; 
      },  

      // DB 
      'UserTable' => function($sm) { 
      $tableGateway = $sm->get('UserTableGateway'); 
      $table = new UserTable($tableGateway); 
      return $table; 
      }, 
      'UserTableGateway' => function ($sm) { 
      $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
      $resultSetPrototype = new ResultSet(); 
      $resultSetPrototype->setArrayObjectPrototype(new User()); 
      return new TableGateway('user', $dbAdapter, null, 
      $resultSetPrototype); 
      }, 

      // FORMS 
      'LoginForm' => function ($sm) { 
      $form = new \Admin\Form\LoginForm(); 
      $form->setInputFilter($sm->get('LoginFilter')); 
      return $form; 
      }, 


      // FILTERS 
      'LoginFilter' => function ($sm) { 
      return new \Admin\Form\LoginFilter(); 
      }, 


      'Admin\Model\ProvincesTable' => function($sm) { 
       $tableGateway = $sm->get('ProvincesTableGateway'); 
       $table = new ProvincesTable($tableGateway); 
       return $table; 
      }, 
      'ProvincesTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Provinces()); 
       return new TableGateway('provinces', $dbAdapter, null, $resultSetPrototype); 
      }, 

      'Admin\Model\DistrictsTable' => function($sm) { 
       $tableGateway = $sm->get('DistrictsTableGateway'); 
       $table = new DistrictsTable($tableGateway); 
       return $table; 
      }, 
      'DistrictsTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Districts()); 
       return new TableGateway('districts', $dbAdapter, null, $resultSetPrototype); 
      }, 



     ), 

     'invokables' => array(), 
     'services' => array(), 
     'shared' => array(), 

    ); 
} 
... 

然后在你的布局或其他任何一个.phtml文件:

layout.phtml 
... 
<?php if ($this->identity()): ?> 
<p>Welcome, <?php echo $this->identity()->getUsername(); ?></p> 
<?php endif; ?> 
+0

我更新了我的答案 – SzymonM

+0

非常感谢亲爱的兄弟,您帮助解决了我的问题。非常感谢你。 – Skylink

0

以SzymonM先生的回答的帮助下,我改变了我如他所建议的Module.php,并写在layout.phtml

下面的简单代码这解决了我的问题和用户名是用大写的第一个字母显示。

<?php 
    if ($this->identity()) 
    { 
     echo ucfirst($this->identity());  
    } 
?> 
//ucfirst is php function which make first letter Uppercase.