top


総投稿数 本 
no_

スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)
no_981

symfony:なんとなく理解し始めたsymfony。求めていたフレームワーク、?かもしれない・・・ 【symfonyで、企業サイトを創る】

 2009-06-16
【前回】
symfony:今日はワクワク。MVCモデルにダイブして、デザインに手を入れるぞ・・・ 【symfonyで、企業サイトを創る】
 ・MVCモデル を理解して
 ・レイアウト変更の基本を学んだ。(2種類のレイアウト)
 ・ヘルパー と呼ばれる用意された
  機能をはじめて触って、便利さを実感
 ・Doctrineに慣れてきた。

今日は、チュートリアルに沿って、続きを楽しむ。


  追記に ▼(長文ご容赦)


※この連載は、はじめて「symfony」に取り組んだmetaboyが、
 いきなり、企業サイトをこれで創ってしまお、という企画。
 参考にするチュートリアルは、
 ◆Practical symfony | Web PHP Framework に加え、
 ◆DAY3: MVCアーキテクチャ : エクスギア Blog

FC2ブログランキング にほんブログ村 IT技術ブログ Webサイト構築へ ブログ王ランキング 人気ブログランキング 人気ホームページランキングへ


more

************************************************
◎ symfonyで、企業サイトを創る:7回目
  ※チュートリアルの3日目 辺り(かな?)
************************************************


 /*------------------------------------------*/
  ●環境
 /*-------------------------------------------*/
   チュートリアルで説明されている
   環境の変更や利用方法は
   一応、理解。
   ・本番環境(prod),開発環境(dev),検証環境(test)
    と、3つの環境があり
    ・web/以下に、アプリケーションごとに
     生成されるのは
     (アプリ名).php (本番)
     (アプリ名)_dev.php (開発) であること。
    ※検証環境(test)については
     また、説明があるのでしょう。


   ・開発環境(dev)として動作する
    (アプリ名)_dev.php の中では
    アクセス制限がされていて
    ・ローカルアクセスしか許さない。


if (!in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')))
{
die('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}
 ・・・作業し易いように、
    Basic認証かけて、とりあえずコメントアウト。
    ※ほんとは危険だよね。

 /*------------------------------------------*/
  ●homepageのルーティングルールを再定義
 /*-------------------------------------------*/
   最初にアクセスさせる、index.php
   ・何も設定がないと
    おなじみ(そう、おなじみになった)の画面
    おなじみ(そう、おなじみになった)の画面ですね。


    ※チュートリアルに(※引用転載)
 ・好奇心のある方なら、'Congratulations'を
  表示するページを探したかもしれません。
   (はい! 探しました!)
 ・結果としてそのようなページは
  askeetプロジェクトディレクトリには見つからず
  不思議に思っていたのではないでしょうか?
   (よくわかりますねぇ)
 ・実は、default/indexアクションの
  テンプレートディレクトリはdataディレクトリという
  プロジェクトから独立した場所で定義されています。
  オーバーライド(上書き)したい場合は、
  defaultモジュールを作りそれぞれのアクションを定義
 ・・・そうなんですか。了解。
   なるほどねぇ。
   ※これからたくさん創る(であろう)
    ・symfonyプロジェクトの すべての
     デフォルトなんですね。

  で、これを(この定義を)変更するのが


   □デフォルトのホームページ(トップページ)再定義
    /apps/(アプリ)/config/routing.yml


# default rules
homepage:
url: /
param: { module: default, action: index }

default_index:
url: /:module
param: { action: index }

default:
url: /:module/:action/*
 ・・・この homepage 部分を
    変更する、ということだ。
    ※私は、今作成しているのは
     ・問い合わせ としてのアプリケーションなので、
     ・トップ頁として 別に用意したアプリケーション
     を登録しておく。
    ま、とにかく、ここで変更する、と。

 /*------------------------------------------*/
  ●テストデータの作成
 /*-------------------------------------------*/
   ここは、一応同じにやっておこう。
    /data/fixtures/001.*****.yml
    /data/fixtures/002.*****.yml
    /data/fixtures/003.*****.yml


   ・「ファイル名は複数存在した場合は名前順で読み込まれる」
    そうなので、ご指導に併せて準備する。
 1:顧客テーブル(マスタ)
 2:カテゴリテーブル(マスタ)
 3:問い合わせテーブル(データ)
 ・・・チュートリアルとは
    違う構造だ。

    で!
    [ 先に ]チュートリアル通りに進めるのが定石
    なのだろうが、私のやり方は違う。
    ・その時必要なことはその時学ぶべきなのだ。
    ここで、テスト用の ymlファイルを作成途中、項目が
    ひとつ抜けている(足りない)ことが判明。
    (問い合わせテーブルに
     ・顧客マスタへのリレーション用id は用意したが
     ・カテゴリマスタへのそれ、が無かった!
    さぁ、テーブルの項目追加、だ。


    ・チュートリアルでは、6日目にある(らしいが)
    「スキーマに変更を加えてSQLを作成し、それを流し込む方法」
     を覚えておく。
     ※phpMyAdmin でテーブル作り直して・・・とも思ったが
      スキーマファイル作成したあとに、例の
      一部の項目定義の諸変更が、また必要になるもの、な。
      (text項目など)


   □フィールドの追加
     /config/doctrine/schema.yml


 1:スキーマの修正
  ・問い合わせテーブルに
   カテゴリマスタテーブルへの
   リレーション用id項目を追加して

   □テストデータの調整


 2:テストデータ
  ・用意したテストデータも、変更をふまえた
   ものに替える

   □コマンドで各変更を反映


 31:モデルとフォームを再生成

$ symfony doctrine:build-model
>> doctrine generating model classes # と表示
$ symfony doctrine:build-form
>> doctrine generating form classes # と表示
$ symfony cc

 32:テーブルを削除(今回は最初から)
  ※phpMyAdmin で実施
 33:モデルからテーブルのCreate文を作成
$ symfony doctrine:build-sql
>> doctrine generating sql for models # と表示
>> doctrine Generated SQL successfully for models # と表示
 ・・・ sqlフォルダに作成
 34:作成したSQLを読み込む
$ mysql -h (ホスト名) (データベース名) -u (アカウント) -p(パスワード) <./data/sql/schema.sql

  ※今回のサーバーでは、この「ホスト」指定が必要
 35:テストデータ作成(今回初めて)
$ symfony doctrine:data-load --dir="data/fixtures/test"
>> doctrine loading data fixtures from "Array"

   ここ、結構苦労。
   最終的に
>> doctrine  loading data fixtures from "data/fixtures/test"
>> doctrine Data was successfully loaded
 ・・・登録できたが、
   苦労したことをメモしておく。
    [ メモ ]ここで、苦労しました!
     □created_at(登録期日)、updated_at(更新期日)
      の項目名を利用した場合
      > symfony は自動的にそれを判断。値を組み込んでくれる。
        が、
        生成されているクラスファイルに編集が必要。
        ・created_at/updated_at 両方あるテーブル
         該当クラスファイルに
    /lib/model/doctrine/(クラス名).class.php
class (クラス名) extends Base(クラス名)
{
public function setUp()
{
parent::setup();
$this->actAs('Timestampable');
}
}
 ・・・と入れないと、
  Validation failed in class (クラス名)
2 fields had validation errors:
* 1 validator failed on created_at (type)
* 1 validator failed on updated_at (type)
 ・・・と怒られる。

     □リレーション用のテーブルで存在しない値を入れると


  Invalid row key specified: , referred to in ii4
 ・・・などと怒られる。

     □Propel では、外部キーの参照方法
      カラム名など、テーブルにあるもの


i1: { user_id: fabien, question_id: q1 }
 ・・・でOKなのだが、
      Doctrineでは、設定したラベル名を利用し
i1: { User: fabien, Question: q1 }
 ・・・などとしないと、
      * 2 validators failed on user_id (type, unsigned)
* 2 validators failed on question_id (type, unsigned)
 ・・・などと怒られる。

この後、チュートリアルでは
 /*------------------------------------------*/
  ●モデルでデータの利用
 /*-------------------------------------------*/
   として、
   ・データ取得の実際を紹介し、
    「エクスギア Blog」では、チュートリアルの説明での
    ・Doctrine や、Propel などのハードコーディングが
     良くない書き方だと指摘されている。(そりゃそうだ)


    □Doctrine では、actionクラスを参照しておけ、と。
    /apps/(アプリ名)/modules/(モジュール名)/actions/actions.class.php


class contactActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{
$this->(モジュール名)_list = Doctrine::getTable('(クラス名)')
->createQuery('a')
->execute();
}
・・・
 ・・・少しソースは進化しているようだが
    確かに、ハードコーディング("Doctrine")だ。
    ※ま、私は後で、Propel に変えることはないと思うが。

   とにかく、取得されたデータは
   「$this->(クラス名)_list」にセットされており、
   このデータが、テンプレートで
   「$(クラス名)_list」として利用されるわけだ。


    □テンプレート(この場合は indexSuccess.php)を確認
    /apps/(アプリ名)/modules/(モジュール名)/templates/indexSuccess.php
    テンプレート(この場合は indexSuccess.php)を確認


     ※なお、Doctrine では、
      ・元チュートリアルの Propel使った場合の
<?php echo count($question->getInterests()) ?>
<?php echo link_to($question->getTitle(), 'question/show?id='.$question->getId()) ?>
<?php echo truncate_text($question->getBody(), 200) ?>
 ・・・という書き方や
<?php echo $rec->getName() ?>
<?php echo $rec->name ?>
<?php echo $rec->get('name') ?>
<?php echo $rec['name'] ?>
 ・・・こんな書き方もできるそうだ。

    この後、チュートリアルでは、
    ・一覧画面のレイアウト変更に説明が移るが、
     私の場合(今回)、一覧画面は必要無く、
     内容を熟読した上で、スルー。


 /*------------------------------------------*/
  ●クリーンアップ
 /*-------------------------------------------*/
   Doctrine が生成した
   ・不要な「アクション」や「テンプレート」を削除しておく。


    生成されたのは、


class (モジュール名)Actions extends sfActions
{
public function executeIndex(sfWebRequest $request)
public function executeNew(sfWebRequest $request)
public function executeCreate(sfWebRequest $request)
public function executeEdit(sfWebRequest $request)
public function executeUpdate(sfWebRequest $request)
public function executeDelete(sfWebRequest $request)
protected function processForm(sfWebRequest $request, sfForm $form)
}
 ・・・だが、
    今回は、「お問い合わせ」フォームなので
    ・executeNew,executeCreate 以外すべて不要だ。

 おぉ、やっとチュートリアルの3日目まで終わった。
 結構、中身濃いけど、楽しい・・・

commentsコメント
comment_post












管理者にだけ表示を許可する
commentトラックバック
トラックバックURL:
http://metaboy.blog23.fc2.com/tb.php/981-0d13fe93
ようこそ
Add to Google 創るmetaboy:RSSフィード
My Yahoo!に追加
最新記事のRSS | 問い合わせ

仕事検索、アルバイト検索、依頼仕事の検索ポータル - 仕事検索.COM - www.jobkensaku.com ツクルン

創るmetaboy - WEB創る、サイト創る、何創る - 創ったmetaboy

 

リンク集

 

最近の記事

 

ブロとも申請フォーム
Sponserd by

さくらのレンタルサーバ さくらのレンタルサーバ
大容量・高機能レンタルサーバー heteml 大容量・高機能レンタルサーバー heteml
XREA (ValueDomain)
お名前.com お名前.com
名づけてねっと名づけてねっと
ムームードメインムームードメイン

 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。