SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

symfony入門

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

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


掲示板作成:データベースとの連携(1/3)

 では、掲示板作成に取り掛かりましょう。前回同様、プロジェクトとアプリケーションの生成から入ります。今回は特にデータベースとの連携がありますので、MVCのM(モデル)部分にフォーカスします。

プロジェクトとアプリケーションの生成

  • プロジェクト名:mysite
  • アプリケーション名:keijiban

 とし、プロジェクトとアプリケーションの生成を行います。

cd mysite
symfony init-project mysite
symfony init-app keijiban

 前回同様、Apache 2.2の「httpd.conf」にもvirtualhost設定を加えておきます(もちろん「conf/extra/httpd-vhosts.conf」を参照する設定にしたうえで、こちらに追記しても構いません)。Apache 2.2やPHP 5.2のインストールフォルダは適宜読み替えてください。

httpd.conf(追記分)
<VirtualHost *:80>
  ServerName localhost
  DocumentRoot "C:\Program Files\Apache Software Foundation
\Apache2.2\htdocs\mysite\web"
  DirectoryIndex index.php
  Alias /sf "C:\php\PEAR\data\symfony\web\sf"

  <Directory "C:\Program Files\Apache Software Foundation
\Apache2.2\htdocs\mysite\web">
   AllowOverride All
  </Directory>

  <Directory "C:\php\PEAR\data\symfony\web\sf">
   allow from all
  </Directory>

</VirtualHost>

scaffolding機能による自動生成

 アプリケーションの生成まで行ったところで、次にデータベースとの連携の準備を進めていきます。

databases.yml編集

 プロジェクトのデータベース接続設定ファイルである「mysite/config/databases.yml」に以下を追記します。ユーザー名、パスワードは適宜書き換えてください。

mysite/config/databases.yml
all:
  propel:  (任意のデータベース接続名。
             「schema.yml」(後述)の
             冒頭にある属性と対応する)
    class: sfPropelDatabase
           (データベースドライバクラスファイル
           「sfPropelDatabase.class.php」。
             Propelによりデータアクセスを行うので変更の必要はない)
    param:
      phptype:  mysql       (データベースシステム。他にsqlserver、
                              pgsql、sqlite、oracleが利用可能)
      host:     localhost   (ホスト名)
      database: codezine    (データベース名)
      username: root        (接続ユーザー名)
      password: root        (接続パスワード)

 これにより、プロジェクトがMySQLデータベース「codezine」を利用できるようになります。

データベース定義ファイルの生成(schema.yml)

 symfonyではモデル作成のために「mysite/config/schema.yml」にテーブル構造を記録し管理しています。このファイルは自らの手で記述することもできますが、通常は既に存在しているテーブルから自動生成した方が簡単です。これはsymfony内でのO/RマッパーであるPropelによって実現されます。

 現在の安定版であるsymfony-0.6.3では、XML記述の「schema.xml」が使用されています(1.0.0-beta2でも引き続き使用できます)。
 

 あらかじめ、Propelのデータベース接続用の設定を行っておきます。Propel用設定ファイルである「mysite/config/propel.ini」内の「propel.database.ini」の項を次のように編集します。

propel.database.url = mysql://root:root@localhost/codezine

 propel.database.urlパラメータで指定しているのは、データベース接続文字列です。接続文字列の形式は、MySQLの場合、「mysql://<データベース接続ユーザー名>:<接続パスワード>@<ホスト名>/<データベース名>」です。今回は便宜上、ユーザー名とパスワードをrootとしていますが、セキュリティなど十分に考慮し、適切なユーザー/パスワード設定を行ってください。

 設定が済んだら、カレントフォルダはプロジェクトフォルダのままで、以下のコマンドを入力します。先程編集した「propel.ini」の設定に従って「codezine」データベースへの接続が行われ、データベース内のすべてのテーブルに関する情報を定義した「schema.yml」が生成されます。

symfony propel-build-schema

 実際に生成されたschema.ymlファイルの中身は次のとおりです。最初の項目が「propel:」となっていますが、これは先程の「databases.yml」に記載されているデータベース接続の名前です(これは任意の値ですが、デフォルトでは名前が「propel」となっています)。

schema.yml
---
propel:                (databases.ymlにあるデータベース接続名)
  bbsdata:             (テーブル名)
    _attributes:       (テーブルの属性が以下にインデントされ記述される)
      idMethod: native (DBMS特有のID割り振りを用いる事を示す。
                         ”none”であればそれを用いない)
    id:                (フィールド名。以下に属性がインデントされ記述される)
      type: INTEGER    (BOOLEAN/INTEGER/FLOAT/DATE/VARCHAR/TIMESTAMP
                         などの型)
      required: true      (trueなら必須項目)
      autoIncrement: true (trueならオートインクリメント属性)
      primaryKey: true    (trueなら主キー)
    title:
      type: VARCHAR
      size: 50            (文字列型において最大文字数の指定)
    author:
      type: VARCHAR
      size: 30
    mail:
      type: LONGVARCHAR
    url:
      type: LONGVARCHAR
    body:
      type: LONGVARCHAR
    passwd:
      type: VARCHAR
      size: 15
    parent_id:
      type: INTEGER
    created_at:
      type: TIMESTAMP

 symfony 0.6.3の時の「schema.xml」に比べれば大分記述が簡潔になっています。symfonyがテーブルにアクセスするオブジェクト名は、「_attributes:」内にphpName属性の値を設定していればそれが、そうでなければテーブル名をやや変えたものが("_"を取り除いてその後の一文字目を大文字にする)使われます。今回の場合オブジェクト名は「Bbsdata」となります。フィールドについて必要な記述は基本的に型のみで、さらにフィールド名によっては何も指定せずとも特定の属性に解釈されます(下表参照)。ファイル中で主要な部分について、表でまとめておきます。

schema.yml内の主要な属性
属性 内容
「_attributes:」内
idMethod: native DBMS特有のID割り振りを用いる事を示す。"none"であればそれを用いない
phpName: Bbsdata テーブルにアクセスするためのオブジェクト名
「フィールド名:」内
type: (原則必須)BOOLEAN/INTEGER/FLOAT/DATE/VARCHAR/TIMESTAMPなどの型(*1
required: trueなら必須項目(デフォルトはfalse)
autoIncrement: trueならオートインクリメント属性
primaryKey: trueなら主キーを示す(*2
size: (文字列型において)最大文字数の指定
default: デフォルト値の指定
sequence: PostgreSQLなどにおけるシーケンス名
index: trueならインデックス指定、uniqueなら重複のないインデックス指定
foreignTable: 外部キーに指定、その際の参照先テーブル名(*3
foreignRefernce: (foreignTable:指定がある時)外部テーブルの参照先フィールド名
onDelete: (外部キーにおいて)cascadeを指定すると、外部テーブルの関連レコードが消去された時に参照元(こちらの)テーブルのレコードが消去される
isCulture: trueであれば国際化対応
  • *1: フィールド名が「created_at」であれば特に指定しなくても「TIMESTAMP」型に設定される
  • *2: フィールド名が「id」の場合は特に指定しなくても、主キーに設定される
  • *3: フィールド名が「_id」で終わる場合は指定しなくても外部キーの指定がなされ、フィールド名の「_id」の前の部分で参照先テーブルが設定される(なお、今回のサンプルで「parent_id」というフィールド名を使用していますが、動作には支障ありません)。
schema.ymlからテーブルを作成する
 今回は既存のテーブルから「schema.yml」を生成しましたが、「schema.yml」を作成してからそれを基にテーブルを作成することも可能です。
symfony propel-build-sql
 と入力する事で、「<プロジェクトフォルダ>/data/sql/」フォルダ内に「lib.model.schema.sql」が生成されます。これをSQLコマンドとして使用すれば、「schema.yml」に従ったテーブルが作成できます。
 

オブジェクトモデルの生成

 次に、この「schema.yml」に従って、symfonyにおけるデータベース操作のためのオブジェクトモデルの自動生成を行いましょう。同じくプロジェクトフォルダ内で次のように入力します。

symfony propel-build-model
 「schema.yml」に「default:」設定があると、うまくオブジェクトモデルが生成されない場合があります。その場合は「default:」設定を削除してください。
 

 これで、テーブルに対応するクラスファイルとメソッドの一群が生成されました。以下に生成されたファイルを示します。

  • mysite/lib/model/om/BaseBbsdata.php
  • mysite/lib/model/om/BaseBbsdataPeer.php
  • mysite/lib/model/Bbsdata.php
  • mysite/lib/model/BbsdataPeer.php
  • mysite/lib/model/map/BbsdataMapBuilder.php

 「schema.yml」に記述されているテーブル名(あるいはphpName属性)から決められたオブジェクト名をもとに、一つのテーブルに対して上記の4つのファイルが生成されます。「<プロジェクトフォルダ>/lib/model/om/」内のクラスファイルは「symfony propel-build-model」を実行するたびに生成される(上書きされる)ベースデータアクセスクラスです。データモデルとそのアクセサメソッドなどが記述された「Base<オブジェクト名>.php」と、目的とするデータを抽出するためのメソッドが記述された「Base<オブジェクト名>Peer.php」があります。

 これらのファイルを継承したものが「<プロジェクトフォルダ>/lib/model/」内の2つのデータアクセスクラスです。上記のファイル名から「Base」が取れたこちらのファイルに、今後カスタム関数などを追加していくことになります。こうすることで、いつデータベース上にテーブルやフィールドを追加して「symfony propel-build-model」を実行しても、クラスファイル内に作成したカスタム関数などが消されてしまうという心配をしなくても済むようになっています。

 これらのクラスファイル群はデフォルトで、コンストラクタ、アクセサメソッド(->getメソッド/->setメソッド)を提供します

 「<オブジェクト名>MapBuilder.php」は、ランタイム用にデータベースモデルを構築するためのクラスファイルです。

CRUD機能の自動生成:scaffolding機能

 これで一通り、symfonyアプリケーションでデータベースを扱うための準備ができました。それでは、ここでscaffolding機能を使用してみましょう。これはデータベース操作のための基本的な機能をなす「足場」を提供するものです。以下のコマンドを入力してください。

symfony propel-generate-crud keijiban bbsdata Bbsdata

 これで、データベース操作に必要な一通りの機能(Create、Retrieve、Update、Delete)を備えたbbsdataモジュールが自動生成されました。引数が3つありますが、「symfony propel-generate-crud <アプリケーション名> <作成するモジュール名> <モデルクラス名>」となっています。

 以下のURLにアクセスしてみてください。

http://localhost/bbsdata
CRUDモジュール作成直後の画面
CRUDモジュール作成直後の画面

 まだ何もレコードがない状態ですが、下にある[create]リンクから、テーブルにレコードを入力することができます。実際にいくつか入力してみてください。これだけのものが揃ったモジュールを自動生成してしまうあたり、symfonyの特色を垣間見ることができます。実際には、以下のアクションとテンプレートが自動生成されています。

scaffolding機能により自動生成されるアクション
アクション名 役割
index listアクションへフォワードされる
list レコード一覧の表示
show 単一レコードの詳細表示
edit レコードの編集
update レコードの更新
delete レコードの削除
create レコードの新規作成
scaffolding機能により自動生成されるテンプレート
テンプレート名 役割
editSuccess.php レコード編集のためのフォーム群
listSuccess.php すべてのレコードの一覧表示
showSuccess.php 単一レコードの詳細表示

 一通りの機能は実現されていますが、もちろんこれらをそのまま使う訳ではなく、あくまでアプリケーションを完成させるための「足場(scaffolding)」という位置づけになっています。

次のページ
掲示板作成:データベースとの連携(2/3)

修正履歴

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

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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

WINGSプロジェクト 川北 季(カワキタ ミノル)

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/837 2008/08/19 20:47

イベント

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

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

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

メールバックナンバー