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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

1883閲覧

再質問 : <Laravel>FormからPOSTしてデータを送信する方法

takataka96

総合スコア0

Laravel

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/04/20 10:20

編集2021/04/20 14:15

前提・実現したいこと

プログラミング初心者です。初めて質問します。
書き方に不備があると思いますが、お力になっていただけると嬉しいです。

現在、ProgateのPHP学習コースの内容をLaravelのローカル環境で実践しています。
そのコースの中の「16.注文確認ページを作ろう」のところで苦戦していて、
どなたか教えていただきたいです。

この章の内容は、メニュー一覧ページ(index.php)のフォームから送信されたそれぞれのメニューの注文個数を受け取り、注文確認ページ(confirm.php)で表示させるという内容です。

propgateでは

data.php

<?php require_once('menu.php'); $juice = new Menu('JUICE', 600, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/juice.png'); $coffee = new Menu('COFFEE', 500, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/coffee.png'); $curry = new Menu('CURRY', 900, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/curry.png'); $pasta = new Menu('PASTA', 1200, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/pasta.png'); $menus = array($juice, $coffee, $curry, $pasta); ?>

index.php

<?php require_once('data.php') ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Café Progate</title> <link rel="stylesheet" type="text/css" href="stylesheet.css"> <link href='https://fonts.googleapis.com/css?family=Pacifico|Lato' rel='stylesheet' type='text/css'> </head> <body> <div class="menu-wrapper container"> <h1 class="logo">Café Progate</h1> <form method="post" action="confirm.php"> <div class="menu-items"> <?php foreach ($menus as $menu): ?> <div class="menu-item"> <img src="<?php echo $menu->getImage() ?>" class="menu-item-image"> <h3 class="menu-item-name"><?php echo $menu->getName() ?></h3> <p class="price">¥<?php echo $menu->getTaxIncludedPrice() ?>(税込)</p> <input type="text" value="0" name="<?php echo $menu->getName() ?>"> <span>個</span> </div> <?php endforeach ?> </div> <input type="submit" value="注文する"> </form> </div> </body> </html>

上記二つのファイルを作成し、index.phpの下記コード

<form method="post" action="confirm.php"> <input type="text" value="0" name="<?php echo $menu->getName() ?>"> <input type="submit" value="注文する"> </form>

でconfirm.phpに値を渡し、

<body> <div class="order-wrapper"> <h2>注文内容確認</h2> <?php foreach ($menus as $menu): ?> <!-- 変数$orderCountに$_POSTで受け取った値を代入してください --> <?php $orderCount=$_POST[$menu -> getName()] ?> <p class="order-amount"> <!-- ここに、$menuのゲッターを用いてnameプロパティを表示してください --> <?php echo $menu-> getName() ?> x <!-- ここに、$orderCountを表示してください --> <?php echo $orderCount ?> 個 </p> <?php endforeach ?> </div> </body>

6行目の<?php $orderCount=$_POST[$menu -> getName()] ?>
ブラウザから受け取ったデータを連想配列変数$_POSTに入れて
confirm.phpを実行しています。

これをLaravel環境で下記内容のようにやってみました。

resoures/views/data.blade.php

<?php require("/Applications/MAMP/htdocs/Cafe/resources/views/menu.blade.php"); // インスタンスの生成 $curry = new Menu('CURRY', 900, "/images/curry.png"); $pasta = new Menu('PASTA', 1200, "/images/pasta.png"); $juice = new Menu('JUICE', 600, "/images/juice.png"); $coffee = new Menu('COFFEE', 500, "/images/coffee.png"); $juice -> setOrderCount(2); $menus = array($curry, $pasta, $juice, $coffee); ?>

resources/views/cafe/index.blade.php

抜粋 <body> <div class="menu-wrapper container"> <h1 class="logo">Café Progate</h1> <div class="menu-items"> <!-- 配列$menusの要素を変数$menuとするforeach文を書いてください --> <?php require ('/Applications/MAMP/htdocs/Cafe/resources/views/data.blade.php') ?> <?php foreach ($menus as $menu) : ?> <div class="menu-item"> <h3 class="menu-item-name"><?php echo $menu->getName() ?></h3> <!-- <p>タグの中に、$menuのpriceプロパティを表示 --> <p class="price">¥<?php echo $menu->getTaxIncludedPrice() ?>(税込)</p> <form action="/confirm" method="POST"> @csrf <!-- <img>タグのsrc属性に、$menuのimageプロパティを表示 --> <img src='<?php echo $menu->getImage() ?>' width="400" height="300"> <!-- $menuのゲッターを用いてorderCountプロパティを表示 --> <p>注文数:<?php echo $menu -> getOrderCount() ?></p> <!-- <input>タグを用いて入力ボックスを作成 --> <!-- 変更 --> <!-- 変更前: <input type="text" value="0" name="<?php $menu -> getName() ?>"> --> <!-- 変更後: <input type="text" value="0" name="order"> --> <input type="text" value="0" name="order"> <span>個</span> </div> <?php endforeach ?> </div> <!-- <input>タグを用いて送信ボタンを作成 --> <input type="submit" value="注文する"></input> </form> </div> </body>

上記2つのファイルで、値を送信

/routes/web.php

<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\CafeController; use Illuminate\Http\Request; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ // トップページ一覧画面を表示 Route::get('/', [CafeController::class, 'showList'])->name('cafes'); // 注文内容を送信 Route::post('/confirm', [CafeController::class, 'confirm'])->name('confirms'); // 注文確認ページを表示 Route::get('/confirm', [CafeController::class, 'confirm'])->name('confirms');

でルーティングを設定

/App/Http/Controllers/CafeController.php

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class CafeController extends Controller { /** * トップ画面一覧を表示する * * @return view */ public function showList() { return view('cafe.top'); } /** * 注文内容を送信し、値をconfirm.blade.phpに返す * * 変更しました */ public function confirm(Request $request) { $orderTotal = $request -> order; return view('confirm', compact('orderTotal')); } }

resources/views/confirm.blade.php

抜粋 <body> <div class="order-wrapper"> <h2>注文内容確認</h2> <!-- 変数$totalPaymentを定義し、数値の0を代入 --> <?php $totalPayment = 0 ?> <?php foreach ($menus as $menu): ?> <?php // 変数$orderCountに$orderTotalで受け取った値を代入してください // CafeController.phpで返された$orderTotalを代入 $orderCount = $orderTotal; // $menuに対して、$orderCountを引数としてsetOrderCountメソッドを呼び出す --> $menu -> setOrderCount($orderCount); // $totalPaymentに、$menuのgetTotalPriceメソッドで得た値を足す $totalPayment += $menu -> getTotalPrice(); ?> <p class="order-amount"> <!-- ここに、$menuのゲッターを用いてnameプロパティを表示してください --> <?php echo $menu-> getName() ?> × <!-- ここに、$orderCountを表示してください --> <?php echo $orderCount ?> 個 </p> <!-- $menuに対してgetTotalPriceメソッドを呼び出して、金額を表示 --> <p class="order-price"> <?php echo $menu -> getTotalPrice() ?>円</p> <?php endforeach ?> <h3>合計金額:<?php echo $totalPayment ?>円</h3> </div> </body> </html>

以上にように書いたところ、

イメージ説明

となります。

実現したいことは、0個、0円のところを

resources/views/cafe/index.blade.php

<input type="text" value="0" name="order">

で入力した値にすることです。

試したこと

①top.blade.phpの

<input type="text" value="0" name="<?php $menu -> getName() ?>">

のneme属性を上記のように修正し、
他の箇所もこれに対応するように変更しましたが
/App/Http/Controllers/CafeController.php
でエラーとなります。

補足情報(FW/ツールのバージョンなど)

Laravel Framework 8.37.0

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/20 10:24

落ち着いて typo を直しましょう。
m.ts10806

2021/04/20 10:37

>POSTしてデータを送信する方法 そもそも「POST」自体が「データの送信」です。
m.ts10806

2021/04/20 10:38

>require ('/Applications/MAMP/htdocs/Cafe/resources/views/data.blade.php'); かなり、ありえません。 ドキュメント(日本語訳でOK)ファーストにしてください。
guest

回答1

0

コントローラーの中でrequireを使ってbladeテンプレートを読み込ませる、
なんてやり方、どこから出てきましたか? 私は今はじめて見ましたよ。

routes/web.phpから。

php

1Route::get('/', 'CafeController@showList')->name('cafes');

って書けば、コントローラーCafeControllerのメソッドshowListが呼ばれることになるかと。

app/Http/Controllers/CafeController.phpから。
データをなんかヘンなクラスで管理しているのをひとまず無視して、
テーブルmenusに持たせているものとするならば、

php

1 public function showList() { 2 $menus = DB::table('menus')->get(); 3 return view('cafe.top', compact('menus')); 4 }

ってコントローラーでテーブルにあるメニューデータを抽出してビューに渡し、

resources/views/cafe.top.blade.phpでは抜粋だけど

php

1@foreach ($menus as $menu) 2 <div class="menu-item"> 3 <img src="{{ $menu->image }}" class="menu-item-image"> 4 <h3 class="menu-item-name">{{ $menu->name }}</h3> 5 <p class="price">¥{{ $menu->taxIncludedPrice }}(税込)</p> 6 <input type="text" value="0" name="{{ echo $menu->name }}"> 7 <span></span> 8 </div> 9@endforeach

みたいなループになるだろうか。
テーブル名やカラム名のすり合わせに注意。
viewの中で表示のためのデータを収集したり加工したりはせず、
そういうことはコントローラー側でやるべきことなので、
それでコントローラーの方でメニュー表示に必要な情報をテーブルから取得し、
取得した変数をビューに渡しています。

Laravelのプロジェクトを立ち上げる上で、
データベースの指定をしたはずで、
プロジェクトの .env ファイルに

DB_CONNECTION=pgsql

これがmysqlとかsqliteとかになってるはずで。
別途然るべきツールでテーブルを作っておくなりデータ投入しておくなりしないと。
へんなデータ管理構造を持ち込むと、かえって作りづらくなるかも。
なるべくは覚えたいデータベースを選択してほしい、
本番環境ではsqliteは使わないだろうし。
(クエリビルダを使うとしても)データベースごとの固有ノウハウがあるので。


PHPを習得したばかりでいきなりLaravelなどのフレームワークに飛びつくと、
今までphpファイル一つでできていたことが
一定のルールに従って役割分担処理分割した上で
いろんなファイルを書かなきゃいけなくなります。
それはシステム開発における設計とデザインとビジネスロジックの分離だったり、
部品の再利用性再生産性を高めるためだったり、
いろんな理由があります。

LaravelはMVCモデル開発ではないと言われますが、
MVCモデルの考え方でビューとコントローラーの役割分担を頭に入れておきたいです。

  • Model --> システムの中でビジネスロジックを担当する
  • View --> 表示や入出力といった処理をする
  • Controller --> ユーザーの入力に基づき,ModelとViewを制御する

MVCモデルについて - Qiitaから引用)

素のPHPは無法地帯というか、ビジネスロジックを記述しつつもHTML出力もできたりして、
ごちゃごちゃしやすいですが、
コントローラーではリクエストの解釈、データの処理を経て表示のためのデータの集計を行い、
ビューでは(コントローラーから)受け取ったデータをテンプレートに従って出力するだけ、
という分担を理解して
ビューで表示するメニューのためのデータは、コントローラー内で抽出して集計してまとめて渡す、
というところをご理解ください。

投稿2021/04/20 10:42

編集2021/04/21 01:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takataka96

2021/04/20 11:18

お忙しい中回答していただきありがとうございます。Laravelについてまだまだ理解できていないと痛感しました。回答を参考にしてもっと勉強します。ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/04/20 11:37

BAつけるの、早くない? ちゃんとLaravelらしいコードを書いて動かしてからでいいですよ。 何も解決していないまま、同様なコードを再度質問させると、回答をつけた方としてはしんどくなるので。 およそ半年前から学び始めて書き始めているLaravelなので、説明が拙いところがあるかもしれないけど、 わかるところまではサポートしますので。
退会済みユーザー

退会済みユーザー

2021/04/21 01:50

resoures/views/data.blade.php みたいなことはやめて、せめてコントローラー内でjsonデータ構造か多重配列で定義したらいいのに。
takataka96

2021/04/21 03:05

再度丁寧に回答していただきありがとうございます。m6uさんの回答通り、PHPを学び始めの自分にはLaravelをやり始めるのが早すぎました。今回Laravelを使った理由は、Progateで学んだことをローカル環境で構築してみたかったからです。ただ今調べたらPHPのビルトインサーバーを使えばローカル環境で構築できそうなので、そちらを使って構築してみます。今回丁寧にLaravelについてご教授していただいたのにこんな形になり申し訳ないです。Laravelを学ぶことをあきらめた訳ではないので、もっと理解が深まった上でわからないことがあったらまた質問します。ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/04/21 04:09

ビルドインサーバーでPHPを学ぶのはいいんですが、遅かれ早かれデータベースの扱い方は避けて通れないため、そちらも並行して習得するのが良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問