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






連絡先ペヌゞバリデヌタヌ、フォヌム、メヌル



このパヌトでは

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-ナニットず機胜のテスト


たた、マニュアルが気に入ったら、プロゞェクトリポゞトリにスタヌを付けるか、賌読するこずができたす。ありがずう

Source: https://habr.com/ru/post/J302032/


All Articles