🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

1031閲覧

laravelのviewのformから値が受け取れない!!

Ichiro08

総合スコア8

Laravel

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/01/03 02:12

やりたいこと

viewのformで入力されたものをcontrollerの $keyword = $_POST['keyword'] ? $_POST['keyword'] : ''; で受け取りたい!!
ですが、うまくいきません。。


具体的に言うと、、、

    1. // $keyword = $_POST['keyword'] ? $_POST['keyword'] : '';
    $keyword = '金沢';


このように上をコメントアウトして直接値を入れているとviewにはちゃんと表示される。

    1. formのactionを{{ route('/home') }}など色々設定してみたけどうまく行かない。下記のエラーが出る。

Route [/home] not defined. (View: /work/resources/views/home/top.blade.php)

  • $keyword = $_POST['keyword'] ? $_POST['keyword'] : '';

//$keyword = '金沢';

このようにコメントアウトを逆にすると下記のエラーが出る。

Undefined index: keyword


このコードたちです

view

1<form action="" method="POST"> 2{{csrf_field()}} 3<div class="p-form"> 4 <div class="p-form-inner"> 5 <input type="text" name="keyword" placeholder="フリーワード検索(店名 地名、駅名など)"> 6 <input type="submit" value=検索> 7 </div> 8 </div> 9 </form> 10

controller

1 public function test2(){ 2 // $keyword = $_POST['keyword'] ? $_POST['keyword'] : ''; 3 4 var_dump($_POST); 5 6 $keyword = '金沢'; 7 $baseurl = 'http://webservice.recruit.co.jp/hotpepper/gourmet/v1/'; 8 $params = [ 9 'key' => 'APIキーは伏せさせて頂きます', 10 'format' => 'json', 11 'keyword' => $keyword, 12 'count' => 20, 13 ]; 14 $url = $baseurl . '?' . http_build_query($params, '', '&'); 15 16 // リクエストを送り結果を取得 17 $result = file_get_contents($url); 18 19 // 取得した翻訳結果のjsonをPHPの連想配列に変換 20 $json = json_decode($result, true); 21 // print_r($json); 22 23 $shops = $json['results']['shop']; 24 25 // エラーがあった場合 26 if( isset($json['results']['error']) ){ 27 echo $json['results']['error'][0]['message']; 28 exit; 29 } 30 31 // 取得件数 32 $results_available = $json['results']['results_available']; 33 if( $results_available > 100 ){ 34 $results_available = 100; 35 } elseif( $results_available == 0 ) { 36 echo '指定の条件ではお店が見つかりませんでした。'; 37 exit; 38 } 39 return view('home.top',compact('keyword','shops' ,'json','results_available')); 40 } 41

route

1Route::get('/home', 'App\Http\Controllers\HomeController@top'); 2Route::get('/home', 'App\Http\Controllers\HomeController@test2'); 3

説明がわかりにくいとは思いますが、解決方法教えてください!!!
よろしくお願い致します!

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

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

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

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

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

phper.k

2021/01/03 02:49

何を参考にこのコードを書いているのでしょうか?
m.ts10806

2021/01/03 03:01

フレームワークでスーパーグローバル変数直参照はありえません。ドキュメント読んでください。
退会済みユーザー

退会済みユーザー

2021/01/03 03:08

Laravelで$_POST使うことはない。PHPは完璧に理解してる前提で「素のPHPではこう書いてたけどLaravelではこう」と全部覚え直す必要がある。PHP初心者がLaravel使うとこういう何もかも間違った使い方するだけなので順番に学習しなければならない。
Ichiro08

2021/01/03 04:09

https://tacs-port.tech/blog/api/blog-241/ ↑ このサイトを参考にしています! PHPですが、laravel用に変換している最中です。。 formから値を渡すには ドキュメントも読んだりして $keyword = $request->input('keyword'); などに変更しているのですが、まだうまく作動していない状況です。。
kai0310

2021/01/03 05:53 編集

参考にしている記事を見ましたが、記事ではLaravelを使用していないですね。
m.ts10806

2021/01/03 06:23

「も」ではなく、主にしてください
Ichiro08

2021/01/03 06:27

参考サイトはPHPで、laravel用に変換できるかと思ったのですが、なかなか苦戦しています。。。
Ichiro08

2021/01/03 06:30

今までは他のサイトなどを中心に読んでいました。。 主にします! ありがとうございます! ドキュメントでわからないときなどは1週間ぐらい考えてもわからないときなどの場合、m.ts10806ならどうされますか?
m.ts10806

2021/01/03 08:31

呼び捨てする人にできるアドバイスはありません。
Ichiro08

2021/01/03 09:09

さんが抜けていました! 大変失礼いたしました!
m.ts10806

2021/01/03 09:28

いずれにしても1週間も悩む時点で根本的にやり方を間違えています。 ドキュメントの多くは辞書として利用するもの。チュートリアルすら通してないのに何かを作ろうとしている時点で間違ってます。 その1週間を基礎演習にまわしたほうが100倍はマシでしょう。 直接的な表現すると、このような質問をしている時間が無駄です。回答やアドバイスもらったところで成長に繋がらない内容です。
Ichiro08

2021/01/03 09:54

勉強になりました! すぐに実践させて頂きます! ありがとうございます!
guest

回答1

0

とりあえず書いてみたらそれほど時間かからずにできたので、書いておきます。
手抜きしているところあるけど、まあまあ及第点は取れるかなと思う程度の出来です。

Fat controller 回避のために app/Services/HotPepperService.php を作成

php

1<?php 2 3namespace App\Services; 4 5use App\Contracts\HotPepperInterface; 6use Illuminate\Config\Repository; 7 8/** 9 * Class HotPepper 10 * @package App\Services 11 */ 12class HotPepper implements HotPepperInterface 13{ 14 private $baseurl; 15 private $key; 16 17 /** 18 * HotPepper constructor. 19 * @param Repository $config 20 */ 21 public function __construct(Repository $config) 22 { 23 $this->baseurl = $config->get('hotpepper.baseurl'); 24 $this->key = $config->get('hotpepper.key'); 25 } 26 27 /** 28 * @param array $query 29 * @return string 30 */ 31 private function request(array $query = []) 32 { 33 $query = array_merge([ 34 'format' => 'json', 35 'key' => $this->key, 36 ], $query); 37 38 $url = sprintf("%s?%s", $this->baseurl, http_build_query($query)); 39 return file_get_contents($url); 40 } 41 42 /** 43 * @param string|null $keyword 44 * @return array 45 */ 46 public function search(string $keyword = null): array 47 { 48 $json = $this->request(compact('keyword')); 49 return json_decode($json, true); 50 } 51}

インターフェースを実装

app/Contracts/HotPepperInterface.php

php

1<?php 2 3namespace App\Contracts; 4 5interface HotPepperInterface 6{ 7 public function search(string $keyword = null): array; 8} 9

app/Providers/AppServiceProvider.php に登録

php

1<?php 2 3namespace App\Providers; 4 5use App\Contracts\HotPepperInterface; 6use App\Services\HotPepper; 7use Illuminate\Support\ServiceProvider; 8 9class AppServiceProvider extends ServiceProvider 10{ 11 /** 12 * Register any application services. 13 * 14 * @return void 15 */ 16 public function register() 17 { 18 // 19 } 20 21 /** 22 * Bootstrap any application services. 23 * 24 * @return void 25 */ 26 public function boot() 27 { 28 $this->app->bind(HotPepperInterface::class, function ($app) { 29 return new HotPepper($app['config']); 30 }); 31 } 32}

config/hotpepper.php を作成

php

1<?php 2 3return [ 4 'baseurl' => env('HOT_PEPPER_BASE_URL'), 5 'key' => env('HOT_PEPPER_KEY'), 6];

.env に追記

HOT_PEPPER_BASE_URL=http://webservice.recruit.co.jp/hotpepper/gourmet/v1/ HOT_PEPPER_KEY={API KEY}

web.php に追記

Route::get('home', 'HomeController@index')->name('home.index');

HomeController

php

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Contracts\HotPepperInterface; 6use Illuminate\Http\Request; 7use Illuminate\View\View; 8 9/** 10 * Class HomeController 11 * @package App\Http\Controllers 12 */ 13class HomeController extends Controller 14{ 15 private $hotPepper; 16 17 public function __construct(HotPepperInterface $hotPepper) 18 { 19 $this->hotPepper = $hotPepper; 20 } 21 22 /** 23 * @param Request $request 24 * @return View 25 */ 26 public function index(Request $request): View 27 { 28 $keyword = $request->keyword; 29 $response = $this->hotPepper->search($keyword); 30 return view('home', compact('response')); 31 } 32}

blade

php

1<form action="" method="GET"> 2 <div class="p-form"> 3 <div class="p-form-inner"> 4 <input type="text" name="keyword" value="{{ request('keyword') }}" placeholder="フリーワード検索(店名 地名、駅名など)"> 5 <input type="submit" value="検索"> 6 </div> 7 </div> 8</form> 9 10 11<div> 12 @if($response['results']) 13 <ul> 14 @foreach ($response['results']['shop'] as $shop) 15 <li>{{ $shop['name'] }}</li> 16 @endforeach 17 </ul> 18 @endif 19</div>

投稿2021/01/03 05:07

編集2021/01/03 05:12
phper.k

総合スコア3923

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

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

Ichiro08

2021/01/03 06:25

ありがとうございます!!! さっそく試してみました! エラーが出て直せませんでした。。。 Target class [HomeController] does not exist. namespaceも確認したんですが、わかりませんでした! php artisan route:listをしてみみました! 下記のエラーが出てしまいます。。 Error Class 'App\Services\HotPepper' not found at app/Providers/AppServiceProvider.php:29 25▕ */ 26▕ public function boot() 27▕ { 28▕ $this->app->bind(HotPepperInterface::class, function ($app) { ➜ 29▕ return new HotPepper($app['config']); 30▕ }); 31▕ } 32▕ } 33▕ +19 vendor frames 20 [internal]:0 Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Console\{closure}(Object(Illuminate\Routing\Route)) +16 vendor frames 37 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 間違っているかもなので、ぼくがやったことを書きます! 間違っていたら教えて頂けると幸いです! ①appにServicesフォルダーを作り、HotPepperService.php を作成。phperさんのコードをコピペ。 ②appにContractsフォルダーを作り、HotPepperInterface.phpを作成。phperさんのコードをコピペ。 ③app/Providers/AppServiceProvider.php にphperさんのコードをコピペ。 ④configにhotpepper.phpファイルを作成。phperさんのコードをコピペ。 ⑤.envにphperさんのコードをコピペ。自分のAPIキーを書き込んだ。 ⑥web.phpにphperさんのコードをコピペ。 ⑦自分が持っていたHomeControllerにphperさんのコードをコピペ。 ⑧bladeにphperさんのコードをコピペ。 ⑥とかのあたりが怪しいでしょうか? 全部のuse App\〜〜とかのあたりもちゃんとあるか確認はしました。 お忙しいとは思いますがご回答頂けたらと思います!!
phper.k

2021/01/03 06:32 編集

動作確認しているコードなので、正しく書いていないのだと思います。 もしくはLaravelのバージョン違いによるかもしれないし、その辺はわからん
phper.k

2021/01/03 06:38

app/Providers/AppServiceProvider.php に間違いがあるんだろう… use 書いてないんじゃないかな?
Ichiro08

2021/01/03 06:57

useは書いてありました! ぼくがどこかでイージーミスしていますね、きっと。。 もう一度正確にやるのを心がけて試してみます!! ありがとうございます!
phper.k

2021/01/03 06:59 編集

Laravelインストールからやればいいと思う。 知識もないのに間違い探ししても見つからないでしょう。
Ichiro08

2021/01/03 07:08

たしかにそうですね! インストールからやり直してみます! ありがとうございます!
m.ts10806

2021/01/03 09:29

いや、PHPとWebの基礎からでしょうね。
phper.k

2021/01/03 09:34 編集

@m.ts10806 さん いちいちそういうこと言わなくてもいいと思いますよ。 本人が気付くならまだしも、そういうこと他人から言われると、ただただ反発するだけですから。 それに、そういうネガティブな書き込みで、毎回自分の回答にメンションが飛んでくるのは回答する側の立場でも嫌です。
m.ts10806

2021/01/03 09:34

失礼しました。時系列が見れてませんでした。 既に別途指摘してるので蛇足でした。
phper.k

2021/01/03 09:40

@m.ts10806さん ご理解いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問