0

現在、Zend 2 の ZfcUser というモジュールからこのコードを探しています。

namespace ZfcUser\Controller;

use Zend\Form\Form;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Stdlib\ResponseInterface as Response;
use Zend\Stdlib\Parameters;
use Zend\View\Model\ViewModel;
use ZfcUser\Service\User as UserService;
use ZfcUser\Options\UserControllerOptionsInterface;

class UserController extends AbstractActionController
{
/**
 * @var UserService
 */
protected $userService;
     .
     .

public function indexAction()
{
    if (!$this->zfcUserAuthentication()->hasIdentity()) {
        return $this->redirect()->toRoute('zfcuser/login');
    }
    return new ViewModel();
}
    .
    .
}

名前空間 ZfcUser\Controller\Plugin で:

名前空間 ZfcUser\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;
use Zend\Authentication\AuthenticationService;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\ServiceManager\ServiceManager;
use ZfcUser\Authentication\Adapter\AdapterChain as AuthAdapter;

class ZfcUserAuthentication extends AbstractPlugin implements ServiceManagerAwareInterface
{
/**
 * @var AuthAdapter
 */
protected $authAdapter;
    .
    .
/**
 * Proxy convenience method
 *
 * @return mixed
 */
public function hasIdentity()
{
    return $this->getAuthService()->hasIdentity();
}
/**
 * Get authService.
 *
 * @return AuthenticationService
 */
public function getAuthService()
{
    if (null === $this->authService) {
        $this->authService = $this->getServiceManager()->get('zfcuser_auth_service');
    }
    return $this->authService;
}

私の質問:

  • indexAction() から、コントローラ プラグインがインスタンス化されずに呼び出されます ($this->zfcUserAuthentication()->hasIdentity())。コントローラ プラグインは常にこのように機能しますか?
  • hasIdentity() で実際に何が起こるのでしょうか? getAuthService() は何かを返しますが、hasIdentity() は返しません。関数呼び出しのこのタイプの高度なクラス実装に慣れていないので、ここでの説明や調べるべきトピックを本当に感謝しています。
4

2 に答える 2

1

最初の質問にはお答えできませんが、2 番目の質問については次のとおりです。

getAuthService()コード内のメソッドAuthenticationServiceは、メソッドを持つオブジェクトを返しますhasIdentity()

したがって、2 つの異なるhasIdentity()方法があります。

ZfcUserAuthenticationクラスのこのコード行:

return $this->getAuthService()->hasIdentity();

次の 3 つのことを行います。

  • $this->getAuthService()オブジェクトを返しAuthenticationServiceます。
  • 次に、そのオブジェクトのhasIdentity()メソッドが呼び出され、 .AuthenticationServiceboolean
  • それbooleanが返されます。

コードを 2 つの部分に分割することを想像してください。

// Get AuthenticationService object     Call a method of that object
$this->getAuthService()                 ->hasIdentity();

それが役立つことを願っています!

于 2012-11-25T18:57:01.817 に答える
0

Zend Frameworkのすべての種類のプラグインは、ServiceManagerのサブクラスであるAbstractPluginManagerのサブクラスであるプラグインマネージャーによって管理されます。

$this->zfcUserAuthentication()AbstractControllerによるpluginmanagerへの内部プロキシ。

AuthenticationService::hasIdentity()このリクエストまたは前のリクエストで認証が成功したときにストレージに何かが追加されたかどうかを確認します。 こちらをご覧ください

于 2012-11-25T19:01:42.693 に答える