SHOEISHA iD

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

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

symfony入門

symfony入門(1):symfonyで始めるPHPフレームワーク

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


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

ダウンロード sample.zip (794.0 B)

symfonyを使ってみよう(3/3)

[4]indexSuccess.phpの編集

 では、このphpファイルの編集を行いましょう。もとのファイルは空ですが、ここに次のように付け加えます。

 文字コードはUTF-8(symfonyデフォルトの設定)で保存してください。
indexSuccess.php
<p>お名前をどうぞ。</p>
<?php echo form_tag('helloworld/youkoso') ?>
<?php echo input_tag('anatano_onamae', 'your name') ?>
<?php echo submit_tag('Save') ?> 
</form>

 付け加えた部分の<?php ~ ?>の部分はヘルパーとよばれるPHP関数で、HTMLで同じ物を書くよりも短く、またsymfony側のURL管理を容易にしています。ヘルパーは多数用意されていますが今回用いたのはその中でもフォームヘルパーとよばれるもので、入力フォームを実現しています。

ヘルパーの種類
ヘルパー種別同等のHTML
form_tag(
'helloworld/youkoso')
フォームタグ<form method="post" action=
"http://localhost/index.php/helloworld/youkoso">
input_tag(
'anatano_onamae', 'your name')
テキストフィールド<input type="text" name="anatano_oname" id="anatano_oname" value="your name" />
submit_tag('Save')サブミットボタン<input type="submit" name="submit" value="Save" />

 個々のテンプレートは<body>タグの中を指定するもので、<head>タグのような共通部分についてはグローバルテンプレートが役割を担っています。アプリケーションフォルダ内の「templates/layout.php」というファイルがそれです。タイトルやキーワードなどの具体的な内容については、ここからさらにアプリケーションフォルダあるいはモジュールフォルダ内の「config/view.yml」が参照されます。アプリケーションやモジュールごとに細かく設定が可能です。以下にアプリケーションフォルダ内の「templates/layout.php」と「config/view.yml」を合わせて示します。前者に対して後者の設定がどう反映されるのか、確認ください。

templates/layout.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>        

<?php echo include_http_metas() ?>(view.ymlのhttp_metas:の部分)
<?php echo include_metas() ?>     (view.ymlのmetas:の部分)

<?php echo include_title() ?>
(タイトル(アクションやview.ymlで設定可))

<link rel="shortcut icon" href="/favicon.ico" />

</head>
<body>

<?php echo $sf_data->getRaw('sf_content') ?>
(ここに個々のテンプレートが反映される)

</body>
</html>
conifig/view.yml
default:
  http_metas: (http-metas設定部分。「http-equiv:content」という書式)
    content-type: text/html; charset=utf-8

  metas:      (metaタグの各部分。「name:content」という書式)
    title:        symfony project
    robots:       index, follow
    description:  symfony project
    keywords:     symfony, project
    language:     en

  stylesheets:    [main]  (スタイルシート読み込み。この場合
                         「<プロジェクトフォルダ>/web/css/main.css」が
                         呼び出される)
  javascripts:    [ ]     (Javascriptファイル読み込み)

  has_layout:     on      (レイアウトファイルを使用)
  layout:         layout  (レイアウトファイル名(拡張子省略))

 今回はここは特に変更しませんが、YAMLフォーマットは直感的に内容の把握しやすいものとなっています。YAMLフォーマットに関する詳細は、本連載後半で解説する予定です。

[5]actions.class.phpの編集

 今度は同じく「helloworld」フォルダ内の「actions/actions.class.php」を編集しましょう。このファイルにはhelloworldモジュールが実行するアクションが記述されています。これも次のように追記します。

actions.class.php
<?php

/**
 * helloworld actions.
 *
 * @package    codezine
 * @subpackage helloworld
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 2692 2006-11-15 21:03:55Z fabien $
 */
class helloworldActions extends sfActions
{
  /**
   * Executes index action
   *
   */
  public function executeIndex()
  {
/*    $this->forward('default', 'module');*/
  }
  public function executeYoukoso()
  {
    print(htmlspecialchars($this->
getRequestParameter('anatano_onamae'))."さん、こんにちは!");
        return sfView::NONE;
  }
}

 既にexecuteIndex()という関数が定義されていますが、これも「execute<アクション名(最初大文字)>」という命名規則に沿っています。つまり、executeIndex()は「index」というデフォルトのアクションです。executeIndex()内は最初$this->forward('default', 'module');とのみ記されています。これは「default」アプリケーションの「module」モジュールにフォワードするという意味で、先ほどのsymfonyのデフォルト画面が表示されるようになっています。もはやデフォルト画面を表示させる必要はありませんし、先ほど編集した「indexSuccess.php」を表示させたいので、フォワード処理はカットします(上記ではコメントアウトしています)。今回追記した executeYoukoso()は「indexSuccess.php」に追記したフォームタグから呼び出される「youkoso」 というアクションを示しています。そして「youkoso」アクション中ではgetRequestParameter()によってフォームからの値を受け取り表示しています。また、最後のreturn sfView::NONE;ですが、これはアクションのリターンをどうするか決めています。戻り値には以下の表にあげたものがあります。

アクションの戻り値
戻り値 概要
sfView::SUCCESS; デフォルトビュー (~Success.php)
'MyResult' ; デフォルトでないビュー (~MyResult.php)
sfView::ERROR; エラービュー (~Error.php)
sfView::NONE; ビューは返さない
sfView::HEADER_ONLY; ビューは返さずヘッダーだけ返す (X-JSONヘッダ利用時などに使用)
sfView::VAR; ビューは返さないが変数を返す(単体テスト時などに使用)

 今回は簡単にするため、youkosoアクションでは特にビューは返さず、値の表示としています。では再び、先ほどのURLにアクセスしてみてください。

http://localhost/helloworld
indexSuccess.phpを編集した後の画面
indexSuccess.phpを編集した後の画面

 「indexSuccess.php」で記述した内容が反映されています。ここでテキストボックスに「codezine」と入れてみましょう。

名前入力後の画面
名前入力後の画面

 URLが「http://localhost/helloworld/youkoso」となっています。お気づきでしょうか。

 これは、「http://localhost/<モジュール名>/<アクション名>」という形式になるからです。実際にこういう階層でファイルが存在するわけではありません。この形式でモジュールとアクションを呼び出す仕組みを担当しているのがMVCの「C」、コントローラの部分です。 symfonyでのフロントコントローラが「index.php」であるのは、先に触れた通りです。実際にこの機能は「スマートURL」あるいは「URIマッピング」と呼ばれています。こういった規則はプロジェクトフォルダやアプリケーションフォルダ内に存在する「config/routing.yml」で定義しています。

config/routing.yml
# default rules
homepage:
(「/」のみのURL指定にはdefaultモジュールの
 indexアクションが呼び出される)
  url:   /
  param: { module: default, action: index }

default_symfony:
(「/symfony/<アクション名>/*」の場合、
 defaultモジュールが呼び出される)
  url:   /symfony/:action/*
  param: { module: default }

default_index:  (「/<モジュール名>」の場合、アクションはindexとなる)
  url:   /:module
  param: { action: index }

default:   (基本的にURLは
            「/<モジュール名>/<アクション名>/*」と解釈する)
  url:   /:module/:action/*

 ルーティングの各項目ごとに、リクエストURLの形式と送られるパラメータが設定できます。デフォルトの状態ではデフォルトのルールだけが記述されていて、「default」の項目で、上記の「/<モジュール名>/<アクション名>/」というマッピングが設定されています。

 最後に、今回編集したファイルの役割と、主なsymfonyコマンドについて示しておきます。

今回作成したアプリケーションとブラウザとのやりとり
今回作成したアプリケーションとブラウザとのやりとり
主なsymfonyコマンド
コマンド 機能
symfony -V symfonyのバージョンを表示する
symfony init-project <project name> プロジェクトを生成する
symfony init-app <application name> アプリケーションを生成する
symfony init-module <application name> <module name> モジュールを生成する
symfony propel-build-schema 既存のデータベースから定義ファイルであるschema.ymlを生成する
symfony propel-build-model schema.ymlをもとにモデルクラスファイル群を生成する
symfony propel-generate-crud <application name> <module name> <model class name> テーブルに対する基本操作(CRUD)のためのモジュールとテンプレートを生成する
symfony cc キャッシュクリアを行う(設定ファイルを変更した後など)

今回のまとめ

 今回はPHPの基本を一通り学習されたばかりの方を対象に、フレームワークとはどういった雰囲気のものであるかをざっと触れ、PHPフレームワークであるsymfonyを紹介、そのインストールから簡単なアプリケーションを作成するところまでを見てみました。

 非常に簡単なアプリケーションでしたが、symfonyコマンドでアプリケーションファイル群が自動生成されていく雰囲気はなんとなく分かってもらえたのではないでしょうか。次回からはsymfonyを使って、実際に掲示板アプリケーションを一から作ってみることとしましょう。

参考資料

  1. symfony(英語)
  2. symfony本家サイトです。英語ですが、この中だけでも、分かりやすい情報源があります。
  3. My first project(英語)
  4. 冒頭で少々紹介したsandboxを使ってのsymfonyチュートリアルです。
  5. askeet(英語、一部日本語)
  6. 2005年12月1日、Web上で毎日少しずつ「askeet」というアプリケーションを作り上げていく企画が始まりました。全部で24日間かけて実用レベルまで完成させ、それをクリスマスプレゼントとして公開するという、なかなか洒落たものでした。チュートリアルとしても非常によく出来ていて、一部日本語化もされています。ここから使えるテクニックも多いと思います。
  7. symfony book
  8. いわゆるリファレンスブックです。困った時に仕組みを把握したい場合など、これを開くのが一番直接的です。
修正履歴

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

  • 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 Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/704 2007/01/09 18:58

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング