Formの作成について

335 views
Skip to first unread message

osamuya

unread,
Nov 15, 2014, 10:15:11 PM11/15/14
to symfony-...@googlegroups.com
お世話になります。Symfony2初心者で現在Formの作成を勉強しております。
こちらの
ドキュメントを参考にしておりますが、
このページにある途中のnote:の部分で、
「この例では AcmeStoreBundle:Default:index コントローラに store_product というルーティングでアクセスできるように設定してあるものとしています。」
とあったのでrouting.ymlにて
acme_store_homepage:
    pattern:  /store_product
    defaults: { _controller: AcmeStoreBundle:Default:index }
というようにルーティングしてみました。
これで通るかなと思ったのですが、テンプレートの方でエラー出て動きませんでした。
An exception has been thrown during the rendering of a template ("Unable to generate a URL for the named route "store_product" as such route does not exist.") in AcmeStoreBundle:Default:index.html.twig at line 1.
テンプレート自体はドキュメントにあるものをコピペしただけなので、特に何かしら悪さをしているように見えないのですが、
何か他に原因があるでしょうか。
基本的な設定はそのままでほぼデフォルトのまま利用しています。
Symfony2.4でphp5.4を使っております。

よろしくお願いします。




Yuichi Okada

unread,
Nov 16, 2014, 10:31:49 AM11/16/14
to symfony-...@googlegroups.com
岡田です。

エラーメッセージの通り「store_product」というルート名が存在しないためURLが
生成できないのが動作しない原因です。

恐らくテンプレートにはドキュメント通り以下の通り記述されているのだと思います。

<form action="{{ path('store_product') }}" method="post" {{ form_enctype(form) }}>

しかし、osamuyaさんが定義したrouting.ymlではルート名を「acme_store_homepage」で定義
しているため、存在していないルート名でURLを生成しようとた結果エラーが発生しています。

ですので「acme_store_homepage」を「store_product」に書き換えれば動作します。

```yml
store_product:
    pattern:  /store_product # ここは何でもOK 自分の好きなパターン
    defaults: { _controller: AcmeStoreBundle:Default:index }
```

twigのpath関数については、「テンプレートの基本 - ページ間をリンクする」を参考にしてください。
以上、試してみてください。

2014年11月16日日曜日 12時15分11秒 UTC+9 osamuya:

osamuya

unread,
Nov 17, 2014, 8:26:03 PM11/17/14
to symfony-...@googlegroups.com

お世話になります。
ありがとうございます。岡田さんのアドバイス通りできちんと動きました。

ルーティングの基本的なところがイマイチわかっていない状態でして、
よろしければ続けていくつか質問させてください。
岡田さんの示してくれた通り、store_product:に書き換えたところ問題なく動作しました。


```yml
store_product:
    pattern:  /store_product # ここは何でもOK 自分の好きなパターン
    defaults: { _controller: AcmeStoreBundle:Default:index }
```
私がドキュメントを読んでもちょっとぼんやりしているところは、実際のアクセスURLになるパターンが、
pattern:  /store_product
というように記述しれているのですが、store_product:の記述とパターンの/store_productという記述は、
どのような関係にあるのでしょうか?
試しにいろいろやってみて、ルーティングの設定で、
store_product: ←そのまま
    pattern:  /store_product1 ←1を加えてみた

    defaults: { _controller: AcmeStoreBundle:Default:index }
で設定し、
http://example.com/[symfonyのあるディレクトリ]/web/app_dev.php/store_product1  ← アクセス時にも1を加えてみた
でアクセスしてみると、きちんとアクセスできました。
しかしstore_product:をstore_product1:などに変更を加えるとアクセスできなくなりました。
パターンとアクセスURLは完全に一致していますが、ルーティングの「store_product:」の部分の設定は、
どこの設定に依存しているのでしょうか?
grepで探してみるとstore_productの文字列は、このルーティング設定のymlにしか記述されていませんでした。

何かしら勘違いをしていて、いささか支離滅裂となってしまいましたが、acme_store_homepageでは駄目で
store_productで動作するというところがイマイチわからずなのです。
よろしくお願いします。

















 

Yuichi Okada

unread,
Nov 20, 2014, 8:04:25 AM11/20/14
to symfony-...@googlegroups.com
すいません。返信遅くなりました。

routing,ymlの1つ目に記載している「store_product」はルート名と呼ばれるルートを

識別するキーになります。連想配列のキーのようなものと考えてください。

これはpattern(path)とは関係なく任意のものを設定することができます。
「acme_store_homepage」でも「store_product1」でも構いません。
好きなものを指定してください。

ただしURL(URI)を生成する時には、このキーを利用しなければなりません。

仮に以下のように設定した場合、


> acme_store_homepage:
>     pattern:  /store_product
>     defaults: { _controller: AcmeStoreBundle:Default:index }

twigのpath関数で渡さなくてはならないのは、route名(= キー)なので
以下の通り記述する必要があります。

<form action="{{ path('acme_store_homepage') }}" method="post">

そうすることで、以下のようにURLが展開されます。

<form action="/store_product" method="post">


ルーティングや、テンプレートでURLを生成する方法はこちらに説明がありますのでご参照ください。
「ルーティング」

また、フォームの章の最下部に同様の質問をされている方がいました。
そちらも合せてご確認いただけたらと思います。
http://docs.symfony.gr.jp/symfony2/book/forms.html


それからもう1点気になるところがあったので補足で説明しますが、Symfony2.2以降
patternは非推奨になり、pathが推奨されるようになりました。

ルーティング - 実例で見るテンプレート

acme_store_homepage:
    path:  /store_product

    defaults: { _controller: AcmeStoreBundle:Default:index }

patternでも動きますが、pathで記述するのがよいと思います。

以上です。

2014年11月18日火曜日 10時26分03秒 UTC+9 osamuya:

osamuya

unread,
Nov 23, 2014, 9:25:38 AM11/23/14
to symfony-...@googlegroups.com
岡田様


お世話になります。
返信ありがとうございます。
(遅くて全然構いません。私の学習が全くおいついていないので。。)

routingの部分はっきりとわかりました!本家のDocumentに目を通すとその部分についても書かれてありました。すみません。
routingの部分がわかったので、この先学習がスムーズに進みそうです。
ありがとうございます。





2014年11月20日木曜日 22時04分25秒 UTC+9 Yuichi Okada:

osamuya

unread,
Dec 12, 2014, 5:03:19 AM12/12/14
to symfony-...@googlegroups.com
岡田様

牛歩ではありますが、勉強すすめております。
フォームに送信されたデータをいろいろやるところで勉強すすめております。
bindするところがなかなかうまくいかなかったのですが、2.4.2では、
handleRequest($request);
を使うようになったところまで調べました。

if ($request->getMethod() == 'POST') {
    $form->handleRequest($request);
}
でもって送信したデータを処理しようかとやってみましたが、handleRequestを利用したところで、

Property password does not exist in class Acme\StoreBundle\Entity\Product


500 Internal Server Error - ValidatorException

というエラーが出ました。
チュートリアルどうりにやっておりますが、こちらのエンティティーのクラスに
何か仕込まなければならないコードなどなるのでしょうか?

if ($request->getMethod() == 'POST') {
    var_dump('foobar');
}
とやると、動作したので、リクエストは届いているようです。

何かアドバイスいただけたらと思います。
よろしくお願いします。



Yuichi Okada

unread,
Dec 14, 2014, 9:24:54 AM12/14/14
to symfony-...@googlegroups.com
詳細が分からないので合っているかわからないですが、
handleRequestは間違ってないと思います。


> Property password does not exist in class Acme\StoreBundle\Entity\Product

エラーの内容はメッセージ通り、Productエンティティにpasswordプロパティーが存在していないことが原因です。

また、ValidatorExceptionが出ていることから、Productエンティティのpasswordプロパティのバリデーションを
行おうとしているが、passwordプロパティが実際には存在しないからではないでしょうか?

エラーメッセージから読み取れるのは以上です。

Symfonyでは$from->handleRequest($request)を呼び出したタイミングでエンティティのバリデーションが行われます。
その実行時のエラーだと思われるので、バリデーションの設定を見なおしてみてください。


チュートリアル通りに進めているとのことですが、具体的にどこをどこまで進めていますでしょうか。

どこまでコードを書いて、どこでつまづいているのか詳細に情報をいただけると良いアドバイスが
できると思いますが、詳細がわからないとこちらも憶測でしか回答ができませんので、色々情報を
いただけると助かります!

以上、よろしくお願いします。


2014年12月12日 19:03 osa

2014年12月12日金曜日 19時03分19秒 UTC+9 osamuya:

osamuya

unread,
Dec 19, 2014, 11:20:32 PM12/19/14
to symfony-...@googlegroups.com
ありがとうございます。
いろいろ試行錯誤したのですが、どこから読み込まれているのかわからないバリデーションが効いてしまいなかなか進めなかったのですが、Symfony2.6.1の最新版にするとうまくいきました。(原因はいまのところはっきりとはわかりません。。。)
今週はこのバリデーションから勉強しようと思います。

いろいろとありがとうございます。

(実際、Symfony2はすごいですね。ものすごいよくできていると思います。)




2014年12月14日日曜日 23時24分54秒 UTC+9 Yuichi Okada:
Reply all
Reply to author
Forward
0 new messages