私は「プライベート」アプリケーションに取り組んでいます。何をするにもログインする必要があります。これにより、Zend Navigation のロールをロードする際に少し問題が発生します。現在、ブートストラップで Zend Navigation を「初期化」しています。ACL を Zend Nav に追加するまでは問題ありませんでした。問題は、認証ストレージから「userRole」をロードしたいのですが、ユーザーがログインするまでストレージがまだないため、ログインページで「オブジェクト以外のプロパティを取得しようとしています」という警告が表示されることです. これは、ログイン前は認証のストレージに何もないためです。ユーザーがログインして認証が構成されるまで、空になるauth->userRole
ため「何もない」ためです。auth->getInstance()->getIdentity()->???
私はログイン ページで Zend Nav を使用していません。実際、ログイン ページには別のレイアウトを使用しています (ナビゲーションはまったくありません)。'if !$auth->hasIdentity'
(false) ログイン レイアウトを使用し、システム全体でログイン ページのみを表示します。アプリケーションは完全にプライベートであると言ったので、「ゲスト」ロールなどをデフォルトにするのは「汚い」アプローチのように思えます。ユーザーがログインすると、とにかく認証を再構成する必要があります。ログインページを喜ばせるためだけに一般的な認証IDを設定するのは正しくないようです。
私が得ているのは、Zend Nav の「init」を移動する、または少なくとも構成 ACL 部分を移動するのに適した場所はどこですか? 全体を動かしてもいいですか?
これは、Zend Navigation の bootstrap.php にあるものです。
protected function _initNavigation() {
$this->_logger->info('Bootstrap ' . __METHOD__);
$this->bootstrap('layout');
$layout = $this->getResource('layout');
$view = $layout->getView();
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
$acl = new Application_Model_Acl_Acl();
$role = Zend_Auth::getInstance()->getIdentity()->userRole;
$view->navigation($container)->setAcl($acl)->setRole($role);
}
'$role = Zend_Auth::getInstance()->getIdentity()->userRole'
ブートストラップの実行時に空 (または非オブジェクト) になるのは です。
私のACLはすべてコントローラーで(アクションで)発生するか、ある時点でモデルで発生する可能性がありますが、Webサービスなどは予想していません。モデルに ACL があるため、柔軟性があります (それは「ドメイン」ですよね?
レイアウト、ユーザー エクスペリエンスの目的で、Zend Nav で ACL のみを使用しています。Zend Nav から取得したメニューとリンクは、ユーザーの役割に応じて「グレー表示」、存在しない、またはアクティブ (および表示) になります。たとえば、「ユーザー」の役割は多くの「管理者」オプションを取得しません。これはコントローラーの ACL によって再適用されるため、単純に URL を入力してエリアに到達することもできませんでした。
私のもう1つの考えは、この状況ではログインをブートストラップに移動することを考えるべきかもしれないということでしたが、それが良い考えかどうかもわかりませんか?
編集: これは、フロントコントローラープラグインに入れたコードです:
class Plugins_Controller_ZendNavInit extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
$acl = new Application_Model_Acl_Acl();
$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$role = Zend_Auth::getInstance()->getIdentity()->userRole;
$view->navigation($container)->setAcl($acl)->setRole($role);
}
}
}
よく働く; もちろん、他のプラグインと同じようにプラグインを登録する必要がありました。また、認証チェックをフロントコントローラープラグインにも移動しました。