質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

5360閲覧

Laravelでディレクトリ構造を変えると値がPOSTされない

qwe001

総合スコア133

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2016/10/17 05:12

以前こちらの質問を投稿したものです。
https://teratail.com/questions/51435

おかげさまで、問い合わせページのviewを表示することに成功しました。ありがとうございます。
表示することができたのはいいものの、入力フォームの値が正しくRequestに通っておらず、次の画面に遷移することができなくて困っています。
組み込み前の、通常のLaravelのディレクトリ配置の時は以下の記述で正しく動作しておりました。

routes/web.php

php

1Route::resource('/', 'ContactController', ['only' => ['index', 'store']]); 2 3Route::get('/confirm', function () { 4 return view('contact.confirm'); 5}); 6 7Route::get('/complete', function () { 8 return view('contact.complete'); 9}); 10 11Route::post('/complete','ContactController@complete');

view contact/index.blade.php

html+php

1{{ Form::open(['url' => '/', 'method' => 'post']) }} 2{{ csrf_field() }} 3{{ Form::text('name', null, ['id' => 'name']) }} 4{{ Form::submit('確認する') }} 5{{ Form::close() }}

controller app/Http/Controllers/ContactController.php

php

1class ContactController extends Controller 2{ 3 public function index(){ 4 return view('contact.index'); 5 } 6 7 public function store(Request $request){ 8 $validator = Validator::make($request->all(), [ 9 'name' => 'required|string', 10 ]); 11 12 if ($validator->fails()) { 13 return redirect() ->back() ->withErrors($validator) ->withInput(); 14 } 15 else { 16 $data = $request -> all(); 17 $request -> session() -> put($data); 18 19 return view('contact.confirm', compact("data")); 20 } 21 } 22 23 public function confirm(Request $request){ 24 $data = $request -> all(); 25 $request -> session() -> put($data); 26 27 return view('contact.confirm', compact("data")); 28 } 29 30 public function complete(Request $request){ 31 $data = session() -> all(); 32 33 return view('contact.complete'); 34 } 35}

indexページで入力フォームに情報を入力すると、storeメソッドにrequestした値がPOSTされて、
confirmメソッドで一度確認画面を挟んだ後、completeメソッドで完了画面を表示するイメージです。

シンボリックリンクを外してからフォームに値を入力すると、正しく完了画面まで遷移しますし、バリデーションエラーも正しくキャッチできています。
しかし、シンボリックリンクをつけると正しく値を入力して送信ボタンを押してもindexページに戻り、何もいれなくてもエラーも表示されません。
何から手を付ければいいのか。。皆様今一度お力をお貸し願えますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

natadyさん
先日に引き続き、度々返信頂きまして、ありがとうございました。
こちら、原因が解明できたのでご報告いたします。

先に結論から申し上げますと、以下のように修正することで解決しました。

{{ Form::open(['url' => '/', 'method' => 'post']) }} ↓ <form action="/contact/" method="post">

どうも.htaccessが原因だったようです。
Laravelは末尾にスラッシュがあるURLは、publicの.htaccessにより、
自動的にスラッシュを削除して301リダイレクトします。
しかし、静的HTML側で書いていた.htaccessに、スラッシュがなければ
自動でスラッシュを付ける記述がありました。

なので、アクセスしているURLをよく見ると、http://example.com/contactではなく、http://example.com/contact/にアクセスしていました。

また、formのactionはhttp://example.com/contactとなっていましたが、
POSTはリダイレクト先まで値を保持できないため、例外処理に値が到着していなかったようです
(GETは届くがPOSTは届かないので、例外処理としては何もしていないという風に解釈されている)
実際の遷移としては

http://example.com/contact/ ↓ http://example.com/contact ↓ http://example.com/contact/

という風なリダイレクトを行っていました。
結果的に期待通りの動きになって本当に安心しました。これで納期に間に合う。。
ありがとうございました。またよろしくお願いいたします。

投稿2016/10/17 11:20

qwe001

総合スコア133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

一つ試したいことがあるのですが…
{{ Form::open(['url' => '/', 'method' => 'post']) }}のurlを '' にするとどうなりますか?

追記

<head>タグの中に以下を追加してみてください。相対パスのベースとなるディレクトリを指定するタグです。

html

1<base href="{{asset('/')}}" />

恐らくですが、シンボリックリンクを張っているページからシンボリックリンクを張っていないページに遷移している気がします。

投稿2016/10/17 08:22

編集2016/10/17 09:04
natady

総合スコア606

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qwe001

2016/10/17 08:36 編集

natady様 返信ありがとうございます。先日はありがとうございました。 こちら url を '' にしても同じく/contactに飛びます。 生成されるformタグのaction属性のurlは '/' でも '' でも同じく http://example.com/contact となっております。なお、urlではなく、['route' => ['store']]としても、ルーティングでRoute::resourceをRoute::getとRoute::postに分解しても同一の結果となります。
natady

2016/10/17 08:38

なるほど… シンボリックリンクを張ったバージョンと張っていないバージョンでaction属性の値は変わりますか?
qwe001

2016/10/17 08:44

はい。ないバージョンではリンク先は「http://example.com/」です。 実はLaravelの組み込み前のものと組み込み後のものは同じサーバーの中で開発をしており、例えばプライベートIPアドレス 192.168.1.1 が組み込み前のもので、192.168.1.2 が組み込み後のものとした場合、1のほうのドキュメントルートが「/var/www/program/public」 2のほうのドキュメントルートが「/var/www/html」となっており、今回アクセスしているのは192.168.1.2/contact です
qwe001

2016/10/17 09:41

追記確認しました。設定しましたが、結果は同じでした。。相対参照のベースを変更できるタグがあるのは初めて知りました。うーん、一度他ディレクトリの制作チームと話し合って、Laravelの通常のディレクトリ構造に収めるように交渉してみることにします。最初からそうすればいいのですが、要件が全然定まらず、納期ギリギリでフレームワークを使用することが確定したのでこのような奇怪なことをすることになった次第です。 回答ありがとうございました。またよろしくお願いいたします
natady

2016/10/17 10:20

よく考えたらhttpメソッドでpost指定してるのにgetになってるの謎ですね...Webサーバのログも見てみたかったです。お役に立てず申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問