SHOEISHA iD

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

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

symfony入門

symfony入門(3):掲示板アプリケーション作成でsymfonyを理解しよう(後篇)

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


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

管理者用画面を用意する:ログイン画面とアドミンジェネレーター

 入力されたレコードの削除などを行う管理者用画面として、モジュール「bbsdatakanri」を生成します。ここでは、さまざまな管理機能を備えたモジュールを自動生成する、アドミンジェネレーターを使用してみましょう。

アドミンジェネレーター

 symfonyには、generate-crudと似た管理者向けのモジュールを自動生成する機能が備わっています。アドミンジェネレーターと呼ばれるもので、次のようにコマンドを入力する事で生成されます(パラメータはpropel-generate-crudと同様です)。

symfony propel-init-admin keijiban bbsdatakanri Bbsdata

 これによりテーブル管理に必要な機能が備わったモジュールが自動生成されます。しかしscaffolding機能を使用した時と異なり、「bbsdatakanri」フォルダを覗いてみても、それらしいファイルは見当たりません。それどころか「actions.class.php」の中身は空のクラスがあるだけで、「templates」フォルダは存在すらしません。

 これはsymfony本体のファイル/クラスを継承している為です。一度使用したものであれば、キャッシュフォルダ「<プロジェクトフォルダ>/cache/<アプリケーション名>/<prod,devなどの環境名>/modules/auto<モジュール名(最初大文字)>/」内に存在しています。アクションは基本的にscaffolding機能による自動生成のものとほぼ同様です。ビューはlistとeditの2つのみ使用しています。

アドミンジェネレーターにより使用されるアクション
アクション名役割
indexlistアクションへフォワードされる
listレコード一覧の表示
editレコードの編集
saveレコードの書き込み
deleteレコードの削除
createレコードの新規作成
アドミンジェネレーターにより使用されるテンプレート
テンプレート名役割
listすべてのレコードの一覧表示
editレコード編集のためのフォーム群

generator.yml編集

 アドミンジェネレーターにより生成された管理モジュールの機能は、「bbsdatakanri/config/generator.yml」を編集することにより行います。今回、以下を追記します。

generator.yml
generator:
  class:              sfPropelAdminGenerator

  # この内側でカスタマイズを行う
  param:
    # モデルクラス名
    model_class:      Bbsdata  

    # 使用するテーマ。テンプレートとスタイルシートの組み合わせで、
    # <dataフォルダ>/generator/sfPropelAdmin/defaultが指名されている)
    theme:            default  

    # listアクションについてのカスタマイズ
    list:  

    # フィルタリングの指定
    filters:          [author, id, parent_id]

 上記ではlist画面でAUTHORIDPARENT_IDでフィルタリング(つまり検索)を行う機能が付加されます。これ以外にもさまざまな項目が設定可能です。詳細はsymfony book内「The admin generator」の項を参照してください。

アドミンジェネレーターによる管理画面
アドミンジェネレーターによる管理画面

管理者ログイン用設定

 ここまででアドミンジェネレーターにより管理モジュールを作成しましたが、管理者画面に誰でもアクセスできるようでは困るので、ごく簡単ですがログイン機能を実装します。ここでは、symfonyにおける認証管理について紹介します(アドミンジェネレーター側でも認証の設定が可能ですが、ここでは敢えてsymfonyアプリ一般の認証管理を使用します)。

管理者画面への誘導:bbsdataモジュール内listSuccess.php追記

 まず掲示板本体の一覧表示画面(「bbsdata」モジュールの「listSuccess.php」)において、管理者ページへのリンクを張ります。といっても直接「bbsdatakanri/list」にリンクするわけではなく、bbsdatakanriモジュールにloginアクションを実装し、そこへ繋がるようにします。「bbsdata/templates/listSuccess.php」に、以下を追加します。

bbsdata/templates/listSuccess.php
<?php echo link_to('管理者ページへ', '/bbsdatakanri/login') ?>

 以降は、「bbsdatakanri」モジュール内のファイルを扱います。

ログイン機能の実装:executeLogin(actions.class.php)

 管理モジュールの方にログイン機能を実装します。まずはアクション(executeLogin)からです。

actions.class.php
<?php

/**
 * bbsdatakanri actions.
 *
 * @package    mysite
 * @subpackage bbsdatakanri
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 2288 
 *             2006-10-02 15:22:13Z fabien $
 */
class bbsdatakanriActions extends autobbsdatakanriActions
{
  public function executeLogin()
  {
    if ($this->getRequestParameter('username') == 'kanri')
    {
      if ($this->getRequestParameter('password') == 'kanri')
      {
        $this->getUser()->setAuthenticated(true);
        $this->getUser()->addCredential('admin');
        return $this->forward('bbsdatakanri','list');
      }
    }
        $this->getUser()->setAuthenticated(false);
  }

  public function executeLogout()
  {
    $this->getUser()->setAuthenticated(false);
  }
}

 ここでは管理者ユーザー名とパスワードを共に「kanri」とし、かつアクション内に記述/認証処理を行っていますが、実際はユーザー名/パスワードは別の場所(userテーブルなど)に保存し、なおかつ暗号化などを行い慎重に管理すべきなのは言うまでもありません。

 ここで注目すべきは$this->getUser()->setAuthenticated(true)の部分です。認証がOKだった場合に、認証の完了をセットしています。続く$this->getUser()->addCredential('admin')では、「admin」という権限を付与しています。この認証がsymfonyでどのように作用するのかは、後述する「security.yml」で設定します。

 同時にログアウト用のアクション(executeLogout)も実装していますが、ここでは「$this->getUser()->setAuthenticated(false)」とすることで、認証を解除しています。

ログイン用画面作成:loginSuccess.php

 ユーザー名とパスワードを入力するテンプレート「loginSuccess.php」を作成します。「templates」フォルダはモジュール生成直後存在しないので、作成してそこにテンプレートを配置します。

loginSuccess.php
<?php echo form_tag('bbsdatakanri/login') ?>

  <fieldset>

  <div class="form-row">
    <label for="nickname">管理者名:</label>
    <?php echo input_tag('username', $sf_params->get('username')) ?>
  </div>

  <div class="form-row">
    <label for="password">パスワード:</label>
    <?php echo input_password_tag('password') ?>
  </div>

  </fieldset>

  <?php echo submit_tag('ログイン') ?>

</form>
管理者ログイン画面
管理者ログイン画面

security.yml作成

 さて、先程loginアクションで指定した$this->getUser()->setAuthenticated(true)$this->getUser()->addCredential('admin')は、ここで生きてきます。以下のファイルを「<モジュールフォルダ(今回はbbsdatakanri)>/config」内に作成します。ファイルの適用範囲はモジュール単位となります。

security.yml
login:               # アクション名
  is_secure: off     # セキュリティOFF:誰でもアクセス可能

logout:
  is_secure: off

all:                 # 上記login、logoutアクション以外すべて
  is_secure: on      # セキュリティON
  credentials: admin # adminのみがアクセス可能

 このようにして当該モジュールにおけるアクションごとにアクセス権限を設定します。ここではlogin、logoutアクション以外は$this->getUser()->addCredential('admin')で指定した「admin」のみがアクセス可能という設定を行っています。

ログアウト処理へのリンク:_list_footer.php

 さて、管理者画面から抜けるためにリスト画面の末尾にログアウト機能を実装したいところですが、「listSuccess.php」は見当たりません。ここで、「templates」フォルダ内に「_list_footer.php」というファイルを以下の内容で作成し、logoutアクションへのリンクを作ります。

_list_footer.php
<?php echo link_to('log out', 'bbsdatakanri/logout') ?>

 ファイル名から推測がつくかと思いますが、このファイルはlistテンプレートのフッターとなります。同様に次のようなカスタムヘッダー/フッターが作成可能です。

  • _list_header.php(listテンプレートのヘッダー)
  • _edit_header.php(editテンプレートのヘッダー)
  • _edit_footer.php(editテンプレートのフッター)

 この他にも非常に柔軟なビューのカスタマイズが可能です。詳細はsymfony book内「The admin generator」の項を参照してください。

ログアウト完了画面:logoutSuccess.php

 logoutアクション実行時に表示されるビューを作成します。

logoutSuccess.php
<h2>ログアウトしました</h2>
<?php echo link_to('戻る', 'bbsdata/list') ?>

セッションの有効期限(settings.yml)

 ここまででログイン機能は実装しましたが、セッションの有効期限も決める必要があるでしょう。セッションの有効期限はアプリケーションフォルダ内の「config/settings.yml」で設定することができます。このファイル内の以下をコメントインします(デフォルトは30分)。

settings.yml(抜粋)
#    timeout:       1800       # Session timeout, in seconds

 コメントにも書いてありますが、秒単位でセッションの有効期限を設定できます。

今回のまとめ

 前回より作成を始めた掲示板アプリケーションに、今回は削除、ページャー、検索の各機能を実装し、また入力値検証と管理者用画面の作成を行いました。そして不要なアクション/ビューを削除し、(MVCの)モデルとコントロールの分離も行いました。

 今回も結構な量になってしまいましたが、symfonyの各機能を紹介しながら実際のアプリケーション作成の様子を垣間見る事ができたのではないかと思います。次回以降は、今回までで紹介しきれなかった各機能に触れていく予定です。

次の記事

参考文献

  1. admin generator commented
  2. アドミンジェネレーター作成の様子が映像で紹介されています。
  1. Escaping output in symfony
  2. symfonyにおけるエスケープ処理について解説されています。
修正履歴

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

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

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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/911 2007/03/09 10:08

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング