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

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

ただいまの
回答率

88.06%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 297

score 6

やりたいこと

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


具体的に言うと、、、

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

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

  • 0. 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


このコードたちです

<form action="" method="POST">
{{csrf_field()}}
<div class="p-form">
        <div class="p-form-inner">
            <input type="text" name="keyword" placeholder="フリーワード検索(店名 地名、駅名など)">
            <input type="submit" value=検索>
        </div>
    </div>
 </form>
  public function test2(){
    // $keyword = $_POST['keyword'] ? $_POST['keyword'] : '';  

      var_dump($_POST);

    $keyword = '金沢';
    $baseurl = 'http://webservice.recruit.co.jp/hotpepper/gourmet/v1/';
    $params = [
        'key' => 'APIキーは伏せさせて頂きます',
        'format' => 'json',
        'keyword' => $keyword,
        'count' => 20,
    ];
    $url = $baseurl . '?' . http_build_query($params, '', '&');

    // リクエストを送り結果を取得
    $result = file_get_contents($url);

    // 取得した翻訳結果のjsonをPHPの連想配列に変換
    $json = json_decode($result, true);
    // print_r($json);

    $shops = $json['results']['shop'];

        // エラーがあった場合
    if( isset($json['results']['error']) ){
      echo $json['results']['error'][0]['message'];
      exit;
    }

    // 取得件数
    $results_available = $json['results']['results_available'];
    if( $results_available > 100 ){
        $results_available = 100;
    } elseif( $results_available == 0 ) {
        echo '指定の条件ではお店が見つかりませんでした。';
        exit;
    }
     return view('home.top',compact('keyword','shops' ,'json','results_available'));
  }
Route::get('/home', 'App\Http\Controllers\HomeController@top');
Route::get('/home', 'App\Http\Controllers\HomeController@test2');

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Ichiro08

    2021/01/03 18:09

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

    キャンセル

  • m.ts10806

    2021/01/03 18:28

    いずれにしても1週間も悩む時点で根本的にやり方を間違えています。
    ドキュメントの多くは辞書として利用するもの。チュートリアルすら通してないのに何かを作ろうとしている時点で間違ってます。
    その1週間を基礎演習にまわしたほうが100倍はマシでしょう。

    直接的な表現すると、このような質問をしている時間が無駄です。回答やアドバイスもらったところで成長に繋がらない内容です。

    キャンセル

  • Ichiro08

    2021/01/03 18:54

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

    キャンセル

回答 1

+2

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

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

<?php

namespace App\Services;

use App\Contracts\HotPepperInterface;
use Illuminate\Config\Repository;

/**
 * Class HotPepper
 * @package App\Services
 */
class HotPepper implements HotPepperInterface
{
    private $baseurl;
    private $key;

    /**
     * HotPepper constructor.
     * @param Repository $config
     */
    public function __construct(Repository $config)
    {
        $this->baseurl = $config->get('hotpepper.baseurl');
        $this->key = $config->get('hotpepper.key');
    }

    /**
     * @param array $query
     * @return string
     */
    private function request(array $query = [])
    {
        $query = array_merge([
            'format' => 'json',
            'key' => $this->key,
        ], $query);

        $url = sprintf("%s?%s", $this->baseurl, http_build_query($query));
        return file_get_contents($url);
    }

    /**
     * @param string|null $keyword
     * @return array
     */
    public function search(string $keyword = null): array
    {
        $json = $this->request(compact('keyword'));
        return json_decode($json, true);
    }
}

インターフェースを実装

app/Contracts/HotPepperInterface.php

<?php

namespace App\Contracts;

interface HotPepperInterface
{
    public function search(string $keyword = null): array;
}

app/Providers/AppServiceProvider.php に登録

<?php

namespace App\Providers;

use App\Contracts\HotPepperInterface;
use App\Services\HotPepper;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->app->bind(HotPepperInterface::class, function ($app) {
            return new HotPepper($app['config']);
        });
    }
}

config/hotpepper.php を作成

<?php

return [
    'baseurl' => env('HOT_PEPPER_BASE_URL'),
    'key' => env('HOT_PEPPER_KEY'),
];

.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

namespace App\Http\Controllers;

use App\Contracts\HotPepperInterface;
use Illuminate\Http\Request;
use Illuminate\View\View;

/**
 * Class HomeController
 * @package App\Http\Controllers
 */
class HomeController extends Controller
{
    private $hotPepper;

    public function __construct(HotPepperInterface $hotPepper)
    {
        $this->hotPepper = $hotPepper;
    }

    /**
     * @param Request $request
     * @return View
     */
    public function index(Request $request): View
    {
        $keyword = $request->keyword;
        $response = $this->hotPepper->search($keyword);
        return view('home', compact('response'));
    }
}

blade

<form action="" method="GET">
    <div class="p-form">
        <div class="p-form-inner">
            <input type="text" name="keyword" value="{{ request('keyword')  }}" placeholder="フリーワード検索(店名 地名、駅名など)">
            <input type="submit" value="検索">
        </div>
    </div>
</form>


<div>
    @if($response['results'])
        <ul>
            @foreach ($response['results']['shop'] as $shop)
                <li>{{ $shop['name'] }}</li>
            @endforeach
        </ul>
    @endif
</div>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/03 18:32 編集

    @m.ts10806 さん
    いちいちそういうこと言わなくてもいいと思いますよ。
    本人が気付くならまだしも、そういうこと他人から言われると、ただただ反発するだけですから。

    それに、そういうネガティブな書き込みで、毎回自分の回答にメンションが飛んでくるのは回答する側の立場でも嫌です。

    キャンセル

  • 2021/01/03 18:34

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

    キャンセル

  • 2021/01/03 18:40

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

    キャンセル

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

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る