最初のsymfonyプロジェクト、パート1

さあ、始めましょうか? 小さくても完成したプロジェクトを書きましょう。 このために正確に1時間を割り当てます。 名前を提案してください。 本屋? 他にアイデアがなければ、ブログを書きます:)



Apacheがローカルマシンにインストールされ、実行されていること、およびPHPが5.1.3以上であることを前提としています。



symfonyのインストール



より早く開始するには、サンドボックスバージョンのSymphonyを使用します。 これはインストールするだけのバージョンで、プロジェクトのデフォルト設定を使用してすぐに開発を開始できます。 別のオプションがあります-裸のディストリビューションからSymphonyをインストールします。 この場合、プロジェクトとその構成の一部を展開するには、いくつかの簡単な手順が必要になります。 私たちの場合、最も抵抗の少ない道をたどります。 したがって、 sf_sandbox_1_2.tgzまたはsf_sandbox_1_2.zipをダウンロードし、コンテンツをプロジェクトフォルダーのルートに解凍します。 Linuxでは、元々tarアーカイブ内にあるファイルに対するこれらの権限を残すことをお勧めします(tarコマンドの-pスイッチを使用します)。 いつものように、何かがうまくいかない場合は、readmeファイルを読みます。 その結果、およそ次のフォルダー構造が得られます。



 www /
   sf_sandbox /
    アプリ/
      フロントエンド/
    キャッシュ/
     config /
    データ/
     doc /
     lib /
    ログ/
    プラグイン/
    テスト/
    ウェブ/
       css /
      画像/
       js /




ここで、 sf_sandboxというプロジェクトに frontendというアプリケーションが含まれていることがわかります。 ブラウザに書き込みます



  http://localhost/sf_sandbox/web/index.php/ 




すべてが機能することを確認します。ページが表示されます







また、もちろん、Symphonyを任意のフォルダーにインストールし、Webサーバーで仮想ホストを構成することもできます。 これについては、 symfonyのインストールの章と全文symphonyリファレンスのsymfonyディレクトリ構造で読んでください。



データモデルを作成する



ブログ、仲間、はあなたがコメントできる投稿です。 したがって、投稿とコメントが保存されるデータベース内のテーブルが必要です。 フレームワーク環境で作業しているため、その組み込みツールを使用してモデルを作成します。 schema.ymlファイルを作成し、それをsf_sandbox / config /フォルダーに配置します。 このファイルに次のように記述します。



推進する:
   blog_post:
     id:〜
    タイトル:{タイプ:varchar(255)、必須:true}
    抜粋:{type:longvarchar}
    本体:{タイプ:longvarchar}
     created_at:〜
   blog_comment:
     id:〜
     blog_post_id:〜
    著者:{タイプ:varchar(255)}
    メール:{タイプ:varchar(255)}
    本体:{タイプ:longvarchar}
     created_at:〜




これは設定ファイルであり、YAML構文に従って作成しました。 非常にシンプルで、XMLに似た構造をインデントできます。 ただし、同じXMLよりも読みやすくなっています。 1つだけ覚えておいてください。インデントにはタブではなくスペースを使用する必要があります。そうしないと、ファイルパーサーがつまずきます。 YAMLの詳細については、 設定の章をご覧ください。



上記のスキーマ(schema.ymlファイルに記述されているものをデータスキーマと呼びます)は、プロジェクトで必要な2つのテーブルの構造を説明しています。 全体的なトリックは、このスキームに基づいて、 blog_postクラスとblog_commentクラスが自動的に作成されることです。 しかし、それについては後で。 ファイルを保存し、コマンドラインで次のように記述します。



 $ php symfony propel:ビルドモデル




このコマンドを実行する前に、現在のフォルダーがプロジェクトのルートフォルダーであることを確認してください(これはsymfonyファイルが置かれている場所であり、パラメーターとともに常に実行されます)。



そのため、このコマンドを実行すると、クラスを持ついくつかのファイルがsf_sandbox / lib / model /フォルダーに作成されます。 これらは、PHPオブジェクトのデータベーステーブルの構造を反映するクラスです(この反映はORMと呼ばれます)。 この場合の「反映」とは、このテーブルに対応するクラスのいくつかのメソッドを呼び出すことにより、テーブル内のレコードを読み取り/追加/変更/削除できることを意味します。 つまり、クラスメソッドを呼び出します-データをテーブルに書き込みます。 別のメソッドを呼び出します-レコードを削除します(すべて、または特定の条件によって)。 SQLクエリを作成せずにこれらすべてを実行できます。 メソッドを呼び出すだけです。 ORMにはいくつかの実装があります。 デフォルトでは、SymphonyはPropelで動作します。 これらのクラスは、アプリケーションのモデルの一部です(詳細については、 モデルの章を参照してください)。



ファイルは良いのですが、データベースにテーブルが必要です! さて、Symphonyを使用してファイルをテーブルに変換します。 デフォルトでは、サンドボックスバージョンのSymphonyは、SQLiteで動作するように構成されています。つまり、データベースの初期化は不要です。 ここで、SQLiteが正常に機能することを確認する必要があります(これについては、php.iniを見て、 PHPのドキュメントを読んでください)。



デフォルトでは、 sf_sandboxプロジェクトはsf_sandbox / data /フォルダーにあるsandbox.dbというデータベースを使用します。

MySQLを使用したい場合(本当にMySQLを使用しますか?:))、シンフォニーにこれについて尋ねるだけです:



 $ php symfony configure:database "mysql:dbname = symfony_project; host = localhost" root mypassword




当然、 symfony_projectデータベースが存在し、パスワードmypasswordで rootユーザーがアクセスできることを確認する必要があります。

ここでsf_sandbox / config / databases.ymlを開き、「phptype」を「mysql」に置き換えて、そこにデータベースの名前を書きます(どこにあるか考えてみてください)。

それでもSQLiteに専念することにした場合は、* nix-systemsのいくつかの権限を変更する必要があります。



 $ chmod 777データdata / sandbox.db




今すぐ実行



 $ php symfony propel:build-sql




その結果、ファイルlib.model.schema.sqlsf_sandbox / data / sql /フォルダーに作成されます。 SQLクエリがこのファイルに書き込まれ、必要なテーブルを作成するために実行できます。 このリクエストを満たすには、次を実行します



 $ php symfony propel:insert-sql




警告が表示されても心配しないでください。 そうであるはずです。 propel:insert-sqlコマンドは、テーブルが作成される前にテーブルを削除します。もちろん、テーブルを今すぐ固定することを警告する必要があります。



ブログの投稿を作成および編集する機能が必要なので、いくつかのフォームが必要になります。 数秒で回路からそれらを作成しましょう:



 $ php symfony propel:ビルドフォーム




このコマンドはsf_sandbox / lib / form /フォルダーにクラスファイルを作成します。 これらのクラスは、要素(プロジェクトの投稿とコメント)を追加および編集するためのフォームを生成するために使用されます。



以前書いたものはすべて忘れてください。 すべてが1つのコマンドで実行されます: propel:build-all :)



申し込みをする



限界まですべてを簡素化します。 投稿とコメントで必要なことは、追加(作成)、受信(取得)、更新(更新)、削除(削除)だけであると想定します。 簡潔にするため、これら4つの操作はCRUDと呼ばれます。



私たちはSymphonyを初めて使用するので、すぐに結果を取得し、それを思い浮かべる必要があります。 結果を達成する最も簡単な方法は、CRUDフォームジェネレータを使用することです。CRUDフォームジェネレータは、データスキームを調べて必要なファイルを作成します。 打ち上げ



 $ php symfony propel:generate-module --non-verbose-templates --with-showフロントエンドの投稿BlogPost
 $ php symfony propel:generate-module --non-verbose-templatesフロントエンドコメントBlogComment
 $ php symfony cache:クリア




propel:generate-moduleを実行するときは、-- non-verbose-templatesスイッチを使用する必要があります。 これが必要な理由を知りたい場合は、 ヘルプキーを使用してコマンドを実行します。



 $ php symfony help propel:generate-module




そのため、 BlogPostクラスBlogCommentクラスによって実装されるオブジェクトを管理する2つのモジュール(投稿とコメント)を取得します 。 Symphony のモジュールは、同様の目的の1つまたは複数のページの形式で表示されます。 新しいモジュールはsf_sandbox / apps / frontend / modules /フォルダーに保存されており、アドレスで見ることもできます:



 http://localhost/sf_sandbox/web/frontend_dev.php/post
 http://localhost/sf_sandbox/web/frontend_dev.php/comment




今すぐ投稿を追加しようとすると、待ち伏せが待っています。 シンフォニーは(まだ)リストに投稿(オブジェクト!)を表示する方法を知りません。 これを行うには、彼女にそれを行う方法を示します。 これを行うには、 BlogPostクラス(ファイルlib / model / BlogPost.php )を修正する必要があります: __toString ()メソッドを追加します:



クラスBlogPostはBaseBlogPostを拡張します
 {
  パブリック関数__toString()
   {
     return $ this-> getTitle();
   }
 }




このメソッドは、オブジェクトを文字列に変換する方法をPHP(およびSymphony)に指示します。 これで、リスト(行内!)で投稿(オブジェクト!)を表示できます。

CSS装飾( sf_sandbox / web / css / main.css file ):



ボディ、td
 {
  フォントファミリ:Arial、Verdana、sans-serif。
  フォントサイズ:12px;
 }

 td {margin:4px; パディング:4px;  }




そして出来上がり! 投稿を追加できます!







ジェネレーターの章でジェネレーターについて、またストラクチャーの章でストラクチャー(プロジェクト、アプリケーション、モジュール)について読むことができます。



上記のリンク(モジュールへのリンク)から、Symphonyでフロントコントローラーと呼ばれる実行可能スクリプトの名前がindex.phpからfrontend_dev.phpに変更されていることがわかります。 これら2つのスクリプトは、異なる環境で同じアプリケーション(フロントエンド)を実行します。 スクリプトfrontend_dev.phpを使用して、開発環境でアプリケーションを実行します。この環境では、デバッグ、ログなど、あらゆる種類のプログラマーのことを試すことができます。 開発環境で作業しているという特徴の特徴は、ページの右上隅にあるパネルと、オンザフライ構成サブシステムです。 このため、このスクリプトは、速度が最適化された作業環境のフロントコントローラーであるindex.phpよりも少し遅くなります。 作業環境で何が起こるかを確認したい場合は、上記のリンクのfrontend_dev.php /index.php /に置き換えて、キャッシュをクリアすることを忘れないでください(くしゃみをするたびに、開発中にキャッシュをクリアする必要があると言いましたか?):



 $ php symfony cache:クリア




 http://localhost/sf_sandbox/web/index.php/




詳細については、 環境に関する章を参照してください。



メインテンプレートの編集



2つのモジュールを切り替えるには、何らかのサイトナビゲーションが必要であることは明らかです。 メインテンプレートに描画します。

メインテンプレートファイルsf_sandbox / apps / frontend / templates / layout.phpを編集し、内部のすべてを置き換えます
  <本体> 
以下に:



 <div id = "container" style = "width:700px; margin:0 auto; border:1px solid gray; padding:10px">
   <div id = "navigation" style = "display:inline; float:right">
     <ul>
       <li> <?php echo link_to(「投稿のリスト」、「投稿/インデックス」)?> </ li>
       <li> <?php echo link_to( 'List of comments'、 'comment / index')?> </ li>
     </ ul>
   </ div>
   <div id = "title">
     <h1> <?php echo link_to(「私の最初のsymfonyプロジェクト」、「@ homepage」)?> </ h1>
   </ div>
 
   <div id = "content" style = "clear:right">
     <?php echo $ sf_data-> getRaw( 'sf_content')?>
   </ div>
 </ div>




開発するのに1時間しかないので、外観に注意を払わず、間違ったことをします。HTMLでスタイルを直接記述します。

なに?







ここにいるので、ページタイトルを置き換えましょう。 アプリケーションのアプリケーション構成ファイル(ビュー)を編集します(ここでは、ビューは略語MVCのV です ):( sf_sandbox / apps / frontend / config / view.yml 、タイトルプロパティが書き込まれている行を探して、プロンプトの何かに変更しますfantasy記号#でコメントアウトされた行がすぐに表示されます。必要に応じてコメントを外すことができます。



デフォルト:
   http_metas:
     content-type:テキスト/ html

  メタ:
     title:史上最高のブログ
     #description:symfonyプロジェクト
     #keywords:symfony、プロジェクト
     #language:en
    ロボット:インデックス、フォロー




メインページも独自のものに置き換える必要があります。 これを行うには、アプリケーションのフォルダではなく、フレームワークに保存されているデフォルトモジュールを編集しますmainと呼ぶ独自のモジュールで書き換え(オーバーライド)できます。



 $ php symfony generate:モジュールフロントエンドメイン




デフォルトでは、アクション(アクション) インデックスには歓迎の言葉が表示されます。 このゴミを削除するには、 sf_sandbox / apps / frontend / modules / main / actions / actions.class.php開きexecuteIndex()メソッドに含まれるすべてをクリアします:



 / **
  *インデックスアクションを実行します
  *
  * @param sfRequest $ request Aリクエストオブジェクト
  * /
パブリック関数executeIndex($リクエスト)
 {
 }




sf_sandbox / apps / frontend / modules / main / templates / indexSuccess.phpファイル編集して、より健全な挨拶を作成します



 <h1>新しいブログへようこそ</ h1>
 <p>あなたは<?php echo rand(1000,5000);  ?>今日の訪問者。</ p>




次に、メインページが要求されたときに実行するアクションをSymphonyに伝える必要があります。 これを行うには、 sf_sandbox / apps / frontend / config / routing.ymlファイルを編集し、ホームページのルールを次のように変更します:



ホームページ:
   url:/
   param:{モジュール:メイン、アクション:インデックス}




考えたことを確認してください:



 http://localhost/sf_sandbox/web/frontend_dev.php/








まあ、それはすでにその場しのぎのWebサイトのように聞こえます。 テスト投稿を作成して、テストコメントを添付することもできます。

このトピックは、 ビューとテンプレートで公開されています



アクションからテンプレートにデータを転送します



まあ、ある程度のスキルがあれば、この時点までに行ったすべての作業にはほとんど時間がかかりません。 次に、 コメントモジュールを投稿モジュールに依存させます。つまり、投稿の下にコメントを表示する必要があります。

まず、コメントを出力後のテンプレートで表示できるようにする必要があります。 Symphonyでは、特定の条件下で何かを行う必要がある場合、これはアクションを介して行われます(たとえば、ページが開かれるとコメント出力されます)。 sf_sandbox / apps / frontend / modules / post / actions / actions.class.php ファイルを開き、 executeShow()メソッドを書き換えます



パブリック関数executeShow($リクエスト)
 {
   $ this-> blog_post = BlogPostPeer :: retrieveByPk($ request-> getParameter( 'id'));
   $ this-> forward404Unless($ this-> blog_post);
 
   $ c =新しい基準();
   $ c-> add(BlogCommentPeer :: BLOG_POST_ID、$ request-> getParameter( 'id'));
   $ c-> addAscendingOrderByColumn(BlogCommentPeer :: CREATED_AT);
   $ this-> comments = BlogCommentPeer :: doSelect($ c);
 }




Criteriaおよび-PerオブジェクトはORM Propelの一部です。 これらの4行のコードは、 blog_commentコメントとblog_post投稿間のSQLレベルの通信を実装します。 投稿テンプレートファイルを修正するために残っています: sf_sandbox / apps / frontend / modules / post / templates / showSuccess.php 、最後に次の行を追加します:



 // ...
 <?php use_helper( 'Text'、 'Date')?>
 
 <hr />
 <?php if($コメント):?>
   <p> <?php echo count($ comments)?>この投稿へのコメント</ p>
   <?php foreach($コメントとしての$コメント):?>
     <?> php echo $ comment-> getAuthor()?>が<?php echo format_date($ comment-> getCreatedAt())?> </ em> </ p>に投稿した<p> <em>
     <div class = "comment" style = "margin-bottom:10px;">
       <?php echo simple_format_text($ comment-> getBody())?>
     </ div>
   <?php endforeach;  ?>
 <?php endif;  ?>




このページでは、ヘルパーと呼ばれるすばらしいものを使用しました。これは、完成したHTMLページの特定の頻繁に使用される部分をページに挿入するPHPコードです。 最初の投稿にコメントを作成し、投稿の下に表示されることを確認します。



 http://localhost/sf_sandbox/web/frontend_dev.php/post/show?id = 1








すべてが正しく行われている場合、これはページのように見えるはずです。

詳細については、 命名規則の章を参照してください。



別のテーブルに関連するレコードをデータベースに挿入する



これはすべてクールですが、これまでのところ、コメントを書くことは不可能です。そのため、コメントしている投稿に自動的に添付されます。 これを行うには、コメント編集ページに移動し、ドロップダウンリストを使用して、添付されている投稿を選択する必要があります。 さて、このようなもの:







投稿に添付されているコメントが何らかの形でシンプルであれば、はるかに良いでしょう。 さあ、やってみましょう! sf_sandbox / apps / frontend / modules / post / templates / showSuccess.phpテンプレートファイル編集して 、次の行を追加します



 <?php echo link_to( 'コメントを追加'、 'コメント/編集?post_id ='。$ blog_post-> getId())?>




link_to()ヘルパーは、 編集モジュールのコメントアクションへのハイパーリンクを作成し、書き込み後すぐにコメントが投稿に添付されるようになりました。 同時に、コメント編集ページのドロップダウンリストによる投稿の選択は消えず、引き続き利用できます。 このセレクターを投稿IDを含む隠しフィールドに置き換えるといいと思います。

Symphonyのフォームはクラスによって制御されます。 したがって、フォームを修正するには、クラスを修正する必要があります。この場合はBlogCommentFormクラスであり、 sf_sandbox / lib / form / folderにあります。



クラスBlogCommentFormはBaseBlogCommentFormを拡張します
 {
   / **
    *フォームがインスタンス化されるときに呼び出されるconfigureメソッド
    * /
  パブリック関数configure()
   {
     $ this-> widgetSchema ['blog_post_id'] = new sfWidgetFormInputHidden();
   }
 }




Symphonyのフォームについては、 Forms Bookをご覧ください。



これで、新しいコメントが書き込まれた投稿に自動的に添付されました。







システムに既にコメントを追加するように教えているので、ユーザーのコメントを追加した後、ユーザーがコメントした投稿のページにジャンプするようにします。 これを実装するには、 processFormメソッドを修正する必要があります。 次のsf_sandbox / apps / frontend / modules / comment / actions / actions.class.phpコードを探しています:



 if($ request-> isMethod( 'post'))
 {
   $ this-> form-> bind($ request-> getParameter( 'blog_comment'));
   if($ this-> form-> isValid())
   {
     $ blog_comment = $ this-> form-> save();
 
     $ this-> redirect( 'comment / edit?id ='。$ blog_comment-> getId());
   }
 }




そして、リダイレクトを次のように変更します。



 $ this-> redirect( 'post / show?id ='。$ blog_comment-> getBlogPostId());




注意すべき点が2つあります:最初に、オブジェクトへの変更を保存するには、フォームオブジェクトのクラスでsave()メソッドを呼び出すだけです(フォームクラスはPropelデータモデルに関連付けられているため、データの変換方法を知っています)データベースに保存するのに適した形式のフォーム)。 次に、保存後すぐにリダイレクトを行うため、ユーザーがフォームを保存した後にブラウザーでF5キーを押しても、フォームは再送信されず、したがって、オブジェクトは再保存されません。 これは非常に良い習慣です!

さて、エントリーは終わりました。 ブログはどこですか? すでにブログを持っています。 彼だけが完全に生です。



次のシリーズを参照してください。





パート2



親愛なるKhabravchians、レッスンの2番目の部分を翻訳する価値はありますか? それとも猿の労働ですか?






All Articles