SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

PHPアプリでのナビゲーションUIの応用
- Zend_Navigation -

Zend Frameworkによる実践的なPHPアプリケーション開発 27

  • X ポスト
  • このエントリーをはてなブックマークに追加

Zend_Aclとの連携

 ウェブページにあるコンテンツのうち、一部は特定の人にのみ見せたい場合があると思います。例えば、一般向けの案内と身内だけが見られるスケジュールなどの情報を、同じウェブサイトで管理する場合です。このように、特定のページは特定の権限を持つ人にのみ見せるようにすることをアクセス管理と呼びます。

 リンク集に関しても、特定の人のみが見られるページへのリンクは、権限のある人にのみ見せるのが良いでしょう。例えば、リスト1のリンクのうち、一部のリンクは特定の人にのみ見せるようにしましょう(リスト8)。

リスト8 リンク集のアクセス管理
×のついたリンクは特定の人にのみ見せる。
(コンテナ)
├─サイト内トップ(index/index)
│  ├─ ナビゲーションの種類
│ │   ├─ メニュー(index/menu)
│  │  ├─ ×リンク(index/links)
│ │  ├─ ×XMLサイトマップ(index/sitemap)
│ │  └─ パンくずリスト(index/breacrumbs)
| └─ ACLのテスト
│     ├─ ACL(index/acl)
│     └─ うまくいかない例(index/aclnotworking)
└─×外部リンク集
   ├─ (×)コードジン(http://codezine.jp/)
   └─ (×)Zend Framework(http://framework.zend.com/)

 これを描画したものが図1です。

図1 特定のリンクのみを表示する
図1 特定のリンクのみを表示する

 Zend_Navigationモジュールは、アクセス管理を担当するZend_Aclモジュールと組み合わせることで、簡単にリンク集のアクセス管理を行うことができます。

アクセス管理とZend_Acl

 まず、アクセス管理について簡単に見ていきましょう。アクセス管理とは、どんな権利を持つ誰が、何をアクセスしてよいかを管理する機能です。Zend_Aclモジュールでは、「誰が」をロール、「権利」を特権(Privilege)、「何を」をリソースと呼びます。なお、リンク集の各リンクは、このうちの「何を見せるか」(リソース)に対応します。

 ここでは単純に2種類のロール、2種類のリソースのあるアクセス管理を考えます。

アクセス管理
種類 名前 説明
ロール guest 一般のユーザー
member 特定の権限を持つユーザー
リソースの種類 public すべてのユーザーが見られる
private 特定のユーザーのみが見られる

 このようなアクセス管理を作成します(リスト9)。

リスト9 コンテナから(IndexController.php)
/* (1)アクセス管理の作成 */
$acl = new Zend_Acl();

/* (2)ロールの登録 */
$acl->addRole('guest');
$acl->addRole('member', 'guest'); //memberはguestの権限も持つ

/* (3)リソースの種類の登録 */
$acl->addResource('private');
$acl->addResource('public');

/* (4)特権の登録 */
$acl->allow('guest', 'public');
$acl->allow('member', 'private');

 アクセス管理の情報はZend_Aclクラスのオブジェクトに登録します。(1)で、まずZend_Aclクラスのオブジェクトを作成しています。

 (2)では、ロールの登録を行なっています。ここではZend_AclのaddRoleメソッドを利用していますが、「member」を登録する際には2つ目の引数に「guest」を渡しています。これは、「member」が「guest」の持つ権限も持っていることを示すための書き方です。そして、(3)ではリソースの種類を登録しています。

 (4)では特権の登録を行っています。最初に「guest」は「public」なリソースを見られることを登録しています。次に、「member」が「private」なリソースを見ることができることを登録しています。なお、「member」は「guest」の権限も持つため、「member」も「public」なリソースを見ることができることに注意してください。

 これで、アクセス権限に関しての登録が終了しました。次は、どのリンクがどの種類のリソースにあたるかの設定です。

Zend_Navigationの設定

 あるリンクが、どの種類のリソースに当たるかは、Zend_Navigation_Pageクラスのresouceプロパティに設定します。例えば、リスト8の「ナビゲーションの種類」の「リンク」(index/links)のリソースを「private」に設定するには、リスト10のようにリンク集のファイルに記述します。

リスト10 リソースを「private」に設定する(links.xml)
...
    <links>
      <action>links</action>
      <controller>index</controller>
      <module>default</module>
      <label>リンク</label>
      <resource>private</resource> <!-- resourceプロパティ の設定-->
    </links>
...

 ここまででアクセス管理の情報(Zend_Aclクラスのオブジェクト)と、各リンクのリソースの種類を設定しました。そうしたら、アクセス管理情報をNavigationビューヘルパのsetAclメソッドに設定すれば、アクセス管理情報をふまえたリンク集の描画が行われます(リスト11)。

リスト11 アクセス管理情報を設定する(IndexController.php)
/* Navigationビューヘルパを取得,
 * ACL を設定
 */
$navigation = $this->view->navigation();
$navigation->setContainer($container);
$navigation->setAcl($acl); //ここでアクセス管理情報を設定
$navigation->setRole('guest');

 なお、あるリンクがアクセス管理の関係で描画されない場合、その子リンクも描画されません。リスト8で「外部リンク」には×が付いているため、その子リンクの「コードジン」「Zend Framework」はアクセス管理上は問題がなくても、描画されません。

おわりに

 今回はZend_Navigationモジュールの応用を扱いました。Zend_Configモジュールを経由してファイルからリンク集を作成したり、Zend_Aclモジュールと連携してアクセス管理を行う方法について、それぞれ見ていきました。どちらもある程度以上の規模のサイトに関するリンク集を作成・管理する上では欠かせない技となるはずです。

 次回は番外編で、Zend Frameworkの部品の紹介から少し脇道をし、Zend FrameworkとPHPのバージョンについて見ていきたいと思います。ご存知の通り、Zend Frameworkのバージョン1.9はPHPのバージョン5.2.4以降に対応しています。一方で、PHPのバージョン5.1系のみがインストールされている環境も多く存在します。そのような環境では何ができ、何ができないか、また同じようなことをするにはどのような解決方法があるか、簡単に見ていきたいと思います。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4940 2010/03/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング