Symfony 2.8 ltsでブログを作成する[パート2]







部品ナビゲーション
パート1-Symfony2とテンプレートの構成

パート3-Doctrine 2とデータフィクスチャ

パート4-Doctrine 2のコメントモデル、リポジトリ、移行

パート5-Twig拡張、サイドバー、および資産

パート6-ユニットおよび機能テスト







連絡先ページ:バリデーター、フォーム、メール





このパートでは:



1.バリデーター

2.フォーム

3.バンドル構成



Githubプロジェクト



必要なマニュアルの一部をインストールする方法については、 リンクでリポジトリの説明を参照してください 。 (たとえば、前のレッスンを経ずにこのレッスンから始めたい場合)





お問い合わせページ



ルーティング



前の章で作成した「About」ページと同様に、連絡先ページのルートを定義することから始めます。 にあるBloggerBlogBu​​ndleルーティングファイルを開きます

src/Blogger/BlogBundle/Resources/config/routing.yml





次のルーティングルールを追加します。



 # src/Blogger/BlogBundle/Resources/config/routing.yml BloggerBlogBundle_contact: path: /contact defaults: { _controller: "BloggerBlogBundle:Page:contact" } requirements: methods: GET
      
      







ここには新しいものは何もありません。ルールは/ contactテンプレートに適用され、HTTP GETメソッドはBloggerBlogバンドルのページコントローラーでcontactAction関数を実行します。



コントローラー



src/Blogger/BlogBundle/Controller/PageController.php





あるBloggerBlogバンドルのページコントローラーに連絡先ページの関数を追加しましょう src/Blogger/BlogBundle/Controller/PageController.php









 class PageController extends Controller { //.. public function contactAction() { return $this->render('BloggerBlogBundle:Page:contact.html.twig'); } }
      
      





これで、この関数は非常にシンプルになり、連絡先ページのテンプレートのみが表示されます。 後でコントローラーに戻ります。



ディスプレイ



テンプレートを作成します。



src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig









そして、次のコンテンツを追加します。



 {# src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig #} {% extends 'BloggerBlogBundle::layout.html.twig' %} {% block title %}Contact{% endblock%} {% block body %} <header> <h1>Contact symblog</h1> </header> <p>Want to contact symblog?</p> {% endblock %}
      
      







このテンプレートも非常に単純です。 レイアウトテンプレートを拡張し、タイトルを再定義し、本文ブロックのコンテンツを定義します。



ページリンク


最後に、連絡先ページapp/Resources/views/base.html.twig



へのリンクを追加するために、アプリケーションテンプレートのリンクを更新する必要があります



 #app/Resources/views/base.html.twig {% block navigation %} <nav> <ul class="navigation"> <li><a href="{{ path('BloggerBlogBundle_homepage') }}">Home</a></li> <li><a href="{{ path('BloggerBlogBundle_about') }}">About</a></li> <li><a href="{{ path('BloggerBlogBundle_contact') }}">Contact</a></li> </ul> </nav> {% endblock %}
      
      







アドレスhttp:// localhost:8000に移動して、ナビゲーションバーの[連絡先]リンクをクリックすると、非常に単純な連絡先ページが表示されます。 これで、適切に構成されたページができたので、次はフォームを操作します。 これには、バリデータとフォーム自体の2つの個別の部分が含まれます。 バリデーターとフォームの概念に移る前に、リクエストからのデータをどのように処理するかを考える必要があります。



連絡先エンティティ



ユーザーからのリクエストを表すクラスを作成することから始めましょう。 リクエストの名前、件名、本文などの基本的な情報を受け入れたいと考えています。 新しいsrc/Blogger/BlogBundle/Entity/Enquiry.php



を作成し、次のコンテンツに貼り付けsrc/Blogger/BlogBundle/Entity/Enquiry.php





 <?php // src/Blogger/BlogBundle/Entity/Enquiry.php namespace Blogger\BlogBundle\Entity; class Enquiry { protected $name; protected $email; protected $subject; protected $body; /** * @return mixed */ public function getName() { return $this->name; } /** * @param mixed $name */ public function setName($name) { $this->name = $name; } /** * @return mixed */ public function getEmail() { return $this->email; } /** * @param mixed $email */ public function setEmail($email) { $this->email = $email; } /** * @return mixed */ public function getSubject() { return $this->subject; } /** * @param mixed $subject */ public function setSubject($subject) { $this->subject = $subject; } /** * @return mixed */ public function getBody() { return $this->body; } /** * @param mixed $body */ public function setBody($body) { $this->body = $body; } }
      
      





ヒント(IDE PHPStormを使用している場合)
ゲッターとセッターを自動的に生成することができます。



これを行うには:



1.ファイル(またはAlt + Insertの組み合わせ)でマウスの右ボタンをクリックし、[生成]を選択します







2.次のゲッターとセッター







3.すべてを強調表示して、[OK]を押します。











ご覧のように、このクラスは、いくつかの保護された変数とそれらにアクセスするためのメソッドを定義するだけです。 変数を検証する方法や、変数がフォーム要素にどのように関係するかを決定するものは何もありません。 これについては後で説明します。



ご注意



Symfony2で名前空間がどのように使用されるかについて話しましょう。 作成したエンティティクラスは、 Blogger\BlogBundle\Entity



名前空間を定義します。 Symfony2はPSR-0自動ロード標準をサポートしているため、名前空間はバンドルファイル構造を直接指します。 Inquiryエンティティクラスはsrc/Blogger/BlogBundle/Entity/Enquiry.php



にあり、Symfony2にクラスの正しいオートロードを提供します。

Symfony2オートローダーは、Blogger名前空間がsrcディレクトリにあることをどのように理解しますか? これは、autoload configuration app/autoload.php



によって保証されます



 /** * @var ClassLoader $loader */ $loader = require __DIR__.'/../vendor/autoload.php'; AnnotationRegistry::registerLoader(array($loader, 'loadClass')); return $loader;
      
      







登録されていないすべての名前空間を登録します。 Blogger名前空間が登録されていないため、Symfony2オートローダーはsrcディレクトリで必要なファイルを検索します。

オートローダーと名前空間はSymfony2の非常に強力な概念です。 PHPがクラスを見つけられないというエラーが発生した場合、おそらく名前空間またはフォルダー構造にエラーがあります。 PHPのrequireまたはincludeを使用してこれを修正しようとしないでください。







フォーム



フォームを作成しましょう。



Symfony2には非常に強力なフォームツールが付属しています。 すべてのSymfony2コンポーネントと同様に、他のプロジェクトでSymfony2の外部で使用できます。 FormsコンポーネントはGitHubで入手できます 。 まず、リクエストフォームを表すAbstractTypeクラスを作成します。 このクラスを台無しにすることなく、コントローラでフォームを直接作成できますが、フォームを別のクラスに分離すると、アプリケーション全体でフォームを再利用できます。 また、コントローラーを散らかさないようにすることもできます。 コントローラーはシンプルでなければなりません。



お問い合わせタイプ


新しいsrc/Blogger/BlogBundle/Form/EnquiryType.php



を作成し、次のコンテンツを追加します。



 <?php namespace Blogger\BlogBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class EnquiryType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name', TextType::class); $builder->add('email', EmailType::class); $builder->add('subject', TextType::class); $builder->add('body', TextareaType::class); } public function configureOptions(OptionsResolver $resolver) { } public function getBlockPrefix() { return 'contact'; } }
      
      





ヒント(IDE PHPStormを使用している場合)
SymfonyプラグインでIDPS PHPStormを使用する場合、InquiryTypeクラスの作成はさらに簡単になります。



バンドルフォルダーを右クリックして、[新規]-> [フォーム]を選択します(またはAlt + Insertを押して[フォーム]を選択します)。







次に、名前InquiryTypeを入力し、上記のように不足している行を追加します(最後のメソッドはgetBlockPrefixであることに注意してください)







InquiryTypeクラスは、 FormBuilderInterfaceインターフェイスを表します。 このインターフェイスは、FormBuilderクラスによって使用されます。 FormBuilderクラスは、フォームの作成に関しては親友です。 メタデータに基づいてフィールドを定義するプロセスを簡素化できます。 クエリエンティティは非常に単純なので、ここではメタデータを定義しないため、FormBuilderはデフォルト値を表示します。



ご注意



ここで、 getBlockPrefixメソッドが一意の識別子を返す必要があることに言及する価値があります。



コントローラーでフォームを作成する





エンティティInquiryおよびInquiryTypeを定義しました。これらを使用するように連絡先関数を更新できます。 src/Blogger/BlogBundle/Controller/PageController.php



にある関数の内容を次のように置き換えます。



 // src/Blogger/BlogBundle/Controller/PageController.php public function contactAction(Request $request) { $enquiry = new Enquiry(); $form = $this->createForm(EnquiryType::class, $enquiry); if ($request->isMethod($request::METHOD_POST)) { $form->handleRequest($request); if ($form->isValid()) { // Perform some action, such as sending an email // Redirect - This is important to prevent users re-posting // the form if they refresh the page return $this->redirect($this->generateUrl('BloggerBlogBundle_contact')); } } return $this->render('BloggerBlogBundle:Page:contact.html.twig', array( 'form' => $form->createView() )); }
      
      







エンティティInquiryのインスタンスを作成することから始めます。 このエンティティは、連絡先リクエストデータを表します。 次に、フォームを作成します。 前に作成したInquiryTypeを定義し、それを照会エンティティオブジェクトに渡します。

これらのコントローラーアクションは送信されたフォームの表示と処理を処理するため、HTTPメソッドを確認する必要があります。 通常、フォームはPOSTメソッドを介して渡され、フォームは例外ではありません。 要求メソッドがPOSTの場合、 submit($request)



を呼び出すと、送信されたデータが$照会オブジェクトの要素に戻ります。 現時点では、$照会オブジェクトには、ユーザーが送信したもののアイデアが含まれています。 次に、フォームに正しく記入されていることを確認するためのチェックを行います。 この時点ではバリデーターを指定しなかったため、フォームは常に有効です。 最後に、視覚化のテンプレートを示します。



名前空間をコントローラにインポートする必要があります 新しいクラスを使用します。 src/Blogger/BlogBundle/Controller/PageController.php



あるコントローラーファイルを更新します。



アプリケーションは既存のものの下に配置する必要があります。



 <?php // src/Blogger/BlogBundle/Controller/PageController.php namespace Blogger\BlogBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; // Import new namespaces use Symfony\Component\HttpFoundation\Request; use Blogger\BlogBundle\Entity\Enquiry; use Blogger\BlogBundle\Form\EnquiryType; class PageController extends Controller { //..
      
      







フォーム表示



Twigテンプレートエンジンのおかげで、フォームの出力は非常に簡単です。 Twigは、フォームを出力するためのマルチレベルシステムを提供します。これにより、必要なカスタマイズのレベルに応じて、フォームを単一のエンティティまたは個別のエラーと要素として表示できます。 Twigメソッドの威力を示すために、次のコードフラグメントでフォーム全体を表示します。



 <form action="{{ path('BloggerBlogBundle_contact') }}" method="post" > {{ form_start(form) }} {{ form_widget(form) }} {{ form_end(form) }} <input type="submit" /> </form>
      
      







プロトタイプと単純なフォームを作成するのは非常に簡単ですが、高度な設定が必要な場合には制限があります。これは多くの場合フォームに当てはまります。



お問い合わせフォームでは、中間点を選択します。 src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig



あるテンプレートコードを置き換えsrc/Blogger/BlogBundle/Resources/views/Page/contact.html.twig







 {# src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig #} {% extends 'BloggerBlogBundle::layout.html.twig' %} {% block title %}Contact{% endblock%} {% block body %} <header> <h1>Contact symblog</h1> </header> <p>Want to contact symblog?</p> {{ form_start(form, { 'action': path('BloggerBlogBundle_contact'), 'method': 'POST', 'attr': {'class': 'blogger'} }) }} {{ form_errors(form) }} {{ form_row(form.name) }} {{ form_row(form.email) }} {{ form_row(form.subject) }} {{ form_row(form.body) }} {{ form_rest(form) }} <input type="submit" value="Submit" /> {% endblock %}
      
      







ご覧のとおり、4つの新しいTwigメソッドを使用してフォームを出力します。



最初のform_startメソッド(ビュー、変数)はフォーム開始タグを表示します。 このヘルパーは、フォーム上の構成メソッドとアクションの出力を処理します。 フォームにアップロードフィールドが含まれている場合は、正しいENCTYPE値も含まれます。



2番目のform_errorsメソッドは、検証が失敗した場合にフォームエラーを出力します。



3番目のform_rowメソッドは、フォームの各領域に関連付けられた整数要素を出力します。 これには、フィールド、ラベルフィールド、および現在のフィールド要素のエラーが含まれます。



最後に、 form_restメソッドを使用します。 フォームの最後でメソッドを使用して、隠しフィールドやSymfony2 Form CSRFトークンなど、忘れてしまったフィールドを作成することは安全なオプションです。



ご注意



クロスサイトリクエストフォージェリ(CSRF)については、 Symfony2のフォームの章で詳しく説明されています。





形状スタイリング





フォームの外観を改善するためにいくつかのスタイルを追加しましょう。 これらのスタイルはバンドル内で固有のものであるため、バンドル自体内の新しいスタイルシートにスタイルを作成します。 新しいsrc/Blogger/BlogBundle/Resources/public/css/blog.css



を作成し、スタイルを貼り付けます。



 .blogger-notice { text-align: center; padding: 10px; background: #DFF2BF; border: 1px solid; color: #4F8A10; margin-bottom: 10px; } form.blogger { font-size: 16px; } form.blogger div { clear: left; margin-bottom: 10px; } form.blogger label { float: left; margin-right: 10px; text-align: right; width: 100px; font-weight: bold; vertical-align: top; padding-top: 10px; } form.blogger input[type="text"], form.blogger input[type="email"] { width: 500px; line-height: 26px; font-size: 20px; min-height: 26px; } form.blogger textarea { width: 500px; height: 150px; line-height: 26px; font-size: 20px; } form.blogger input[type="submit"] { margin-left: 110px; width: 508px; line-height: 26px; font-size: 20px; min-height: 26px; } form.blogger ul li { color: #ff0000; margin-bottom: 5px; }
      
      







このスタイルシートを使用することをアプリケーションが認識する必要があります。 連絡先ページのテンプレートにスタイルシートを含めることもできますが、他のテンプレートもこれらのスタイルを後で使用するため、最初の部分で作成したBlogger BlogBu​​ndle レイアウトにスタイルをインポートすることは理にかなっています。 BloggerBlogBu​​ndle レイアウト src/Blogger/BlogBundle/Resources/views/layout.html.twig



、コンテンツを次の内容に置き換えます。



 {# src/Blogger/BlogBundle/Resources/views/layout.html.twig #} {% extends '::base.html.twig' %} {% block stylesheets %} {{ parent() }} <link href="{{ asset('bundles/bloggerblog/css/blog.css') }}" type="text/css" rel="stylesheet" /> {% endblock %} {% block sidebar %} Sidebar content {% endblock %}
      
      







親テンプレートで定義されている再定義のためにスタイルのブロックを導出したことがわかります。 親メソッドが呼び出されていることに注意することが重要です。 これには、 app/Resources/base.html.twig



で定義されているスタイルシートが含まれ、新しいスタイルシートを追加できます。 既存のスタイルシートを上書きしたくありません。

アセット機能にファイルを正しく含めるには、アプリケーションのWebフォルダー内のバンドルリソースをコピーまたはリンクする必要があります。 これは、コンソールで次のコマンドを使用して実行できます。



php app/console assets:install web --symlink









これで、ページを更新すると、フォームはさらに魅力的になります。







src/Blogger/BlogBundle/Resources/config/routing.yml



にあるルートを変更して、POSTリクエストを処理しましょう。



 # src/Blogger/BlogBundle/Resources/config/routing.yml BloggerBlogBundle_contact: path: /contact defaults: { _controller: "BloggerBlogBundle:Page:contact" } requirements: methods: GET|POST
      
      







ご注意



フォームを送信すると、期待どおりに機能するはずですが、ページは単に連絡先フォームにリダイレクトします。





バリデーター



Symfony2バリデーターにより、データ検証を実行できます。 検証は、フォームのデータを操作する際の一般的なタスクです。 データの検証は、データベースに送信する前に完了する必要もあります。

Symfony2バリデーターを使用すると、検証ロジックを、フォームコンポーネントやデータベースコンポーネントなど、それを使用できるコンポーネントから分離できます。 このアプローチは、オブジェクトを検証するための一連のルールがあることを意味します。



src/Blogger/BlogBundle/Entity/Enquiry.php



あるエンティティInquiryを更新することから始めましょう。いくつかのバリデータを指定します。 ファイルの上部に4つの新しいステートメントを追加してください。



 <?php // src/Blogger/BlogBundle/Entity/Enquiry.php namespace Blogger\BlogBundle\Entity; use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\Length; class Enquiry { public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('name', new NotBlank()); $metadata->addPropertyConstraint('email', new Email()); $metadata->addPropertyConstraint('subject', new Length(array( 'max' => 50 ))); $metadata->addPropertyConstraint('body', new Length(array( 'min' => 50 ))); } //..
      
      







バリデータを定義するには、静的メソッドloadValidatorMetadataを実装する必要があります。 ClassMetadataオブジェクトが提供されます。 このオブジェクトを使用して、エンティティの要素に制限を設定できます。

最初のNotBlankステートメントは、name要素に適用されます。 NotBlankバリデーターは、フィールドが空かどうかを確認します。

次に、ユーザーが電子メールを正しく入力したかどうかを確認します。 Symfony2サービスは、ドメイン検証など、電子メールフィールドが正しく入力されていることを検証する検証ツールを提供します。

トピックフィールドを空にせず、50文字以下で、50文字以上のメッセージを含める必要があります。

1つのフィールドに必要な数のバリデータを適用できます。



バリデーターの完全なリストは、Symfony2のリファレンスドキュメントで提供されています。 カスタムバリデーターを作成することもできます。



これで、フォームを送信すると、データが検証されます。 間違ったメールアドレスを入力してみてください。 電子メールアドレスが無効であることを通知するエラーメッセージが表示されます。 各バリデーターはデフォルトのメッセージを表示しますが、必要に応じてオーバーライドできます。 たとえば、検証ツールの電子メールメッセージを変更するには、次の操作を実行できます。



 $metadata->addPropertyConstraint('email', new Email(array( 'message' => 'symblog does not like invalid emails. Give me a real one!' )));
      
      







ご注意



HTML5をサポートするブラウザーを使用する場合、特定の制限付きでHTML5メッセージを受け取ります。 これはクライアント側のチェックであり、Symfony2はエンティティメタデータに基づいて適切なHTML5制限を設定します。 これはメール要素で確認できます。 HTMLレンダリング



 <input type="email" id="contact_email" name="contact[email]" required="required">
      
      







彼は、新しいHTML5フィールドタイプの1つを使用して、電子メールを送信し、必要な属性を設定しました。 クライアント側の検証は、フォームを検証するためにサーバー要求を必要としないため、大きなプラスです。 ただし、クライアント側の検証は単独で使用しないでください。 クライアント側でチェックをバイパスするのは非常に簡単なので、サーバー側で提示されるデータを常にチェックする必要があります。







メール送信



お問い合わせフォームではユーザーがリクエストを送信できますが、実際にはまだ何も起きていません。 コントローラを更新して、ブログのウェブマスターにメールを送信しましょう。 Symfony2には、電子メールを送信するためのSwiftMailerライブラリが付属してます。 Swift Mailerは非常に強力なライブラリであり、このライブラリで何ができるかについて触れます。



SwiftMailer設定を構成する


Swift MailerはSymfony2で動作するように設定されていますが、送信方法とパーミッションに関するいくつかのパラメーターを設定する必要があります。 app/config/parameters.yml



あるパラメーターファイルを開き、mailer_プレフィックスが付いた設定を見つけます。



mailer_transport: smtp

mailer_host: 127.0.0.1

mailer_user: null

mailer_password: null









Swift Mailerには、SMTPサーバーの使用、ローカルのSendmailインストールの使用、Gmailアカウントの使用など、電子メールを送信するための多くの方法が用意されています。 簡単にするために、Gmailアカウントを使用します。 ユーザー名とパスワードを置き換えてパラメーターを更新します。



mailer_transport: gmail

mailer_encryption: ssl

mailer_auth_mode: login

mailer_host: smtp.gmail.com

mailer_user: _

mailer_password: _











重要!



プロジェクトにGitなどのバージョン管理システム(VCS)を使用する場合、特にリポジトリが公開されている場合は注意してください。 アプリケーションファイルを確認する必要があります

app/config/parameters.yml





VCSのリストを無視するために追加されました







コントローラー


次のコードをコピーして、 src/Blogger/BlogBundle/Controller/PageController.php



あるページコントローラーを更新します。



 if ($form->isValid()) { $message = \Swift_Message::newInstance() ->setSubject('Contact enquiry from symblog') ->setFrom('enquiries@symblog.co.uk') ->setTo('email@email.com') ->setBody($this->renderView('BloggerBlogBundle:Page:contactEmail.txt.twig', array('enquiry' => $enquiry))); $this->get('mailer')->send($message); $this->get('session')->getFlashBag()->add('blogger-notice', 'Your contact enquiry was successfully sent. Thank you!'); // Redirect - This is important to prevent users re-posting // the form if they refresh the page return $this->redirect($this->generateUrl('BloggerBlogBundle_contact')); }
      
      







SwiftMailerライブラリを使用してSwift_Messageを作成すると、電子メールとして送信できます。



ご注意



Swift Mailerライブラリは名前空間を使用しないため、Swift Mailer \クラスのプレフィックスを付ける必要があります。 これにより、PHPはグローバルスペースに戻るように指示されます。 \の名前空間を持たないすべてのクラスと関数にプレフィックスを追加する必要があります。 このプレフィックスをSwift_Messageクラスの前に配置しない場合、PHPは現在のネームスペース(この例ではBlogger \ BlogBu​​ndle \ Controller)のクラスに表示され、エラーが発生します。





また、セッションでフラッシュメッセージを設定します。フラッシュメッセージは、1回のリクエストで保存されるメッセージです。その後、それらはSymfony2から自動的にクリアされます。連絡先テンプレートにフラッシュメッセージが表示され、リクエストが送信されたことをユーザーに通知します。フラッシュメッセージは1つのリクエストに対してのみ保存されるため、以前のアクションが成功したことをユーザーに通知するのに理想的です。



フラッシュメッセージを表示するにsrc/Blogger/BlogBundle/Resources/views/Page/contact.html.twig



は、テンプレートの内容を更新する連絡先テンプレートを更新する必要があります

 //.. <header> <h1>Contact symblog</h1> </header> {% for flashMessage in app.session.flashbag.get('blogger-notice') %} <div class="blogger-notice"> {{ flashMessage }} </div> {% endfor %} <p>Want to contact symblog?</p> //..
      
      







このコードは、ブロガー通知識別子を持つフラッシュメッセージが設定および表示されているかどうかを確認します。



ウェブマスターのメール登録



Symfony2は、独自の設定を定義するために使用できる構成システムを提供します。上記のコントローラーでアドレスをハードコーディングするのではなく、このシステムを使用してウェブマスターのメールを設定します。したがって、コードを複製することなく、この値を他の場所で簡単に再利用できます。さらに、あなたのブログがあなたにとってあまりにも多くのトラフィックを引き起こしている場合、アシスタントにメールを送信するためにあなたのメールアドレスを簡単に更新することができます。新しいファイルsrc/Blogger/BlogBundle/Resources/config/config.yml



作成し、次を貼り付けます。



 parameters: # Blogger contact email address blogger_blog.emails.contact_email: contact@email.com
      
      







パラメータを定義するときは、コンポーネントの数でパラメータ名を区切ることをお勧めします。最初の部分は小文字で、アンダースコアを使用して単語を区切る必要があります。この例では、BloggerBlogBu​​ndleバンドルをblogger_blogに変更しました...残りのパラメーター名には、任意の数のパーツを含めることができます。(ドット)。これにより、パラメータを論理的にグループ化できます。

Symfony2アプリケーションが新しいパラメーターを使用するには、メインアプリケーション構成ファイルに構成をインポートする必要があります。そのapp/config/config.yml



ためには、次を追加します。



 # app/config/config.yml imports: # .. existing import here - { resource: "@BloggerBlogBundle/Resources/config/config.yml"}
      
      







インポートパスは、ディスク上のファイルの物理的な場所です。



最後に、contactAction関数更新して、パラメーターを使用します。



 // src/Blogger/BlogBundle/Controller/PageController.php public function contactAction(Request $request) { $enquiry = new Enquiry(); $form = $this->createForm(EnquiryType::class, $enquiry); if ($request->isMethod($request::METHOD_POST)) { $form->handleRequest($request); if ($form->isValid()) { $message = \Swift_Message::newInstance() ->setSubject('Contact enquiry from symblog') ->setFrom('enquiries@symblog.co.uk') ->setTo($this->container->getParameter('blogger_blog.emails.contact_email')) ->setBody($this->renderView('BloggerBlogBundle:Page:contactEmail.txt.twig', array('enquiry' => $enquiry))); $this->get('mailer')->send($message); $this->get('session')->getFlashBag()->add('blogger-notice', 'Your contact enquiry was successfully sent. Thank you!'); // Redirect - This is important to prevent users re-posting // the form if they refresh the page return $this->redirect($this->generateUrl('BloggerBlogBundle_contact')); } } return $this->render('BloggerBlogBundle:Page:contact.html.twig', array( 'form' => $form->createView() )); }
      
      







ヒント



構成ファイルはアプリケーション構成ファイルの最上部にインポートされるため、アプリケーションにインポートされたパラメーターを簡単にオーバーライドできます。たとえば、次の行を下部に追加するapp/config/config.yml



と、パラメーター値が上書きされます。



 # app/config/config.yml parameters: # Blogger contact email address blogger_blog.emails.contact_email: assistant@email.com
      
      









メールテンプレートの作成



電子メールの本文にテンプレートが表示されます。このテンプレートを作成しsrc/Blogger/BlogBundle/Resources/views/Page/contactEmail.txt.twig





、次を追加します。

 {# src/Blogger/BlogBundle/Resources/views/Page/contactEmail.txt.twig #} A contact enquiry was made by {{ enquiry.name }} at {{ "now" | date("Ymd H:i") }}. Reply-To: {{ enquiry.email }} Subject: {{ enquiry.subject }} Body: {{ enquiry.body }}
      
      







また、このテンプレートの拡張子が、作成した他のテンプレートとは異なることにお気づきかもしれません。拡張子.txt.twigを使用します。拡張子の最初の部分である.txtは、生成するファイル形式を定義します。一般的な形式には、.txt、.html、.css、.js、XML、および.jsonが含まれます。拡張機能の最後の部分は、使用するテンプレートエンジン(この場合はTwig)を決定します。.php拡張子は、PHPを使用してテンプレートを表示します。

これで、リクエストを送信すると、blogger_blog.emails.contact_emailパラメーターで指定されたアドレスにメールが送信されます







Symfony2 SwiftMailer Symfony2. . , Symfony 2 SwiftMailer , . app/config/config_test.yml







 swiftmailer: disable_delivery: true
      
      







, Dev . , , . , Dev , app/config/config_dev.yml









電子メールが送信されたことを確認する方法に驚くでしょう。Symfony2には、開発者ツールバーを使用したこのためのソリューションがあります。レターが送信されると、ツールバーにメール通知アイコンが表示され、レターに関するすべての情報が表示されます。

連絡先フォームの場合のように、メールの送信後にリダイレクトする場合、ツールバーにメール通知を表示するには、intercept_redirects設定app/config/config_dev.yml



true設定する必要があります次のパラメーターをDev構成ファイルに配置







することにより、SwiftMailerを構成して、すべての電子メールをDev環境の特定の電子メールアドレスに送信できます 位置する app/config/config_dev.yml







 swiftmailer: delivery_address: development@symblog.dev
      
      







おわりに



ウェブサイトの最も基本的な部分の1つであるフォームを作成するための概念を示しました。

次に、このチュートリアルのほとんどであるModelについて説明します。Doctrine 2について話し、それを使用してブログモデルを定義しましょう。また、データフィクスチャの概念も調べます。



ソースと副資材:



https://symfony.com/

http://tutorial.symblog.co.uk/

http://twig.sensiolabs.org/

http://www.doctrine-project.org/

ます。https:/ /getcomposer.org/



ポスト台本
, , , .






パート1-Symfony2とテンプレートの構成

パート3-Doctrine 2とデータフィッティング

パート4-コメントモデル、リポジトリ、移行Doctrine 2

パート5-Twig拡張、サイドバー、アセット

パート6-ユニットと機能のテスト





また、マニュアルが気に入ったら、プロジェクトリポジトリにスターを付けるか、購読することができますありがとう



All Articles