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

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

ただいまの
回答率

90.61%

  • PHP

    19882questions

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

  • Laravel

    646questions

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

フォームからpostがうまく送れていない。

解決済

回答 1

投稿 編集

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

takanori2018

score 2

コード

Laravel5.6で名刺管理アプリを作成しています。

フォームを作成し、名刺情報を追加登録する際に、バリデーションをかけたいのですが、うまくできません。
フォームで名刺情報の名前・会社名・電話番号・住所・emailを入力するとバリデーションが行われ、それに通ると確認画面に遷移、通らなかった場合はフォーム入力画面に戻るシステムを作っています。
しかしうまくいきません。

フォームに入力後、postがうまく確認画面に送られていないのか、と思いvar_dump関数を使い、postの中身を調べました。
postの中身は意図したものと全く異なっているものでした。
このようなエラーメッセージが続き、フォームで記入したものは送られていません。

object(Illuminate\Http\Request)#55 (27) { ["json":protected]=> NULL ["convertedFiles":protected]=> NULL ["userResolver":protected]=> object(Closure)#320 (3) { ["static"]=> array(1) { ["app"]=> object(Illuminate\Foundation\Application)#5 (30) { ["basePath":protected]=> string(27) "C:\xampp\htdocs\meishikanri" ["hasBeenBootstrapped":protected]=> bool(true) ["booted":protected]=> bool(true) ["bootingCallbacks":protected]=> array(0) { } ["bootedCallbacks":protected]=> array(1) { [0]=> object(Closure)#270 (1) { ["this"]=> object(App\Providers\RouteServiceProvider)#195 (3) { ["namespace":protected]=> string(20) "App\Http\Controllers" ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } } } ["terminatingCallbacks":protected]=> array(0) { } ["serviceProviders":protected]=> array(19) { [0]=> object(Illuminate\Events\EventServiceProvider)#8 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [1]=> object(Illuminate\Log\LogServiceProvider)#11 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [2]=> object(Illuminate\Routing\RoutingServiceProvider)#14 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [3]=> object(Illuminate\Auth\AuthServiceProvider)#136 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [4]=> object(Illuminate\Cookie\CookieServiceProvider)#143 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [5]=> object(Illuminate\Database\DatabaseServiceProvider)#146 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [6]=> object(Illuminate\Encryption\EncryptionServiceProvider)#154 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [7]=> object(Illuminate\Filesystem\FilesystemServiceProvider)#157 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [8]=> object(Illuminate\Foundation\Providers\FormRequestServiceProvider)#165 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [9]=> object(Illuminate\Foundation\Providers\FoundationServiceProvider)#163 (4) { ["providers":protected]=> array(1) { [0]=> string(58) "Illuminate\Foundation\Providers\FormRequestServiceProvider" } ["instances":protected]=> array(1) { [0]=> object(Illuminate\Foundation\Providers\FormRequestServiceProvider)#165 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } } ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [10]=> object(Illuminate\Notifications\NotificationServiceProvider)#169 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [11]=> object(Illuminate\Pagination\PaginationServiceProvider)#172 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [12]=> object(Illuminate\Session\SessionServiceProvider)#177 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [13]=> object(Illuminate\View\ViewServiceProvider)#182 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [14]=> object(Fideloper\Proxy\TrustedProxyServiceProvider)#187 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [15]=> object(App\Providers\AppServiceProvider)#189 (2) { ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [16]=> object(App\Providers\AuthServiceProvider)#191 (3) { ["policies":protected]=> array(1) { ["App\Model"]=> string(24) "App\Policies\ModelPolicy" } ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [17]=> object(App\Providers\EventServiceProvider)#193 (4) { ["listen":protected]=> array(1) { ["App\Events\Event"]=> array(1) { [0]=> string(27) "App\Listeners\EventListener" } } ["subscribe":protected]=> array(0) { } ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } [18]=> object(App\Providers\RouteServiceProvider)#195 (3) { ["namespace":protected]=> string(20) "App\Http\Controllers" ["app":protected]=> *RECURSION* ["defer":protected]=> bool(false) } } ["loadedProviders":protected]=> array(19) { ["Illuminate\Events\EventServiceProvider"]=> bool(true) ["Illuminate\Log\LogServiceProvider"]=> bool(true) ["Illuminate\Routing\RoutingServiceProvider"]=> bool(true) ["Illuminate\Auth\AuthServiceProvider"]=> bool(true) 

フォームのソースコードは以下の通りです。

    <p>新規に登録する名刺の情報を入力してください。
    <form action="confirm" method="post">
        {{ csrf_field() }}
        <p><label for="name field" > お名前 <span class="required" > ※必須</span ></label><br>
            <input type="text" name = "name" id = "name-field" required value="{{old('name')}}"></p >
        <p><label for="company field" > 会社名<span class="required" > ※必須</span ></label ><br >
            <input type="text" name = "company" id = "company-field" required value="{{old('company')}}"></p>
        <p ><label for="tel field" > 電話番号<span class="required" > ※必須</span ></label ><br >
            <input type="tel" name = "tel" id = "tel-field" required value="{{old('tel')}}"></p>
        <p><label for="address field" > 住所<span class="required"> ※必須</span ></label ><br >
            <input type="text" name = "address" id = "address-field" required value="{{old('address')}}"></p>
        <p><label for="email field" > email<span class="required" > ※必須</span ></label ><br >
            <input type="text" name = "hobby" id = "email-field" required value="{{old('email')}}"></p>
        <input type = "submit" name="directupload" value="送信">
    </form >

    <div>
        @if(count($errors)>0)
            <ul>
                @foreach($errors->all() as $error)
                    <li>{{$error}}</li>
                @endforeach
            </ul>
        @endif

    </div>
    </p>

なぜこのようなpostが送られてしまっているのか、わかりません。
ご教授いただけると幸いです。

フォームが送られる確認画面(confirm)では以下の処理を行います。

    public function confirm(Request $request)
    {
        dd($request);
        $validator = $this->getValidator($request);

        //バリデーションチェックが通らなかったらフォーム画面にリダイレクト

        if ($validator->fails()) {
            // フォーム画面ヘリダイレクト
            return redirect('form')
                ->withErrors($validator)
                ->withInput();
        } else {

            // 確認画面を表示する*/
            return view('confirm');
        }
    }

バリデーターの処理は以下の通りです。

//confirm画面・result画面で使用するバリデーションのルール
    public function getValidator(array $Input)
    {
        $rules = [
            'name' => 'required|string|max:60',
            'company' => 'required|string|max:60',
            'tel' => 'required|numeric|digits_between:10,11',
            'address' => 'required|string|max:60',
            'email' => 'required|email'];


        $validator = Validator::make($Input, $rules);

        return $validator;
    }


フォームの名前・会社名・電話番号・住所・emailすべてを埋めた状態で送った 
ddコマンドの出力は以下の通りです。

Request {#55 ▼
  #json: null
  #convertedFiles: null
  #userResolver: Closure {#320 ▶}
  #routeResolver: Closure {#343 ▶}
  +attributes: ParameterBag {#65 ▶}
  +request: ParameterBag {#64 ▶}
  +query: ParameterBag {#63 ▶}
  +server: ServerBag {#67 ▶}
  +files: FileBag {#60 ▶}
  +cookies: ParameterBag {#66 ▶}
  +headers: HeaderBag {#68 ▶}
  #content: null
  #languages: null
  #charsets: null
  #encodings: null
  #acceptableContentTypes: null
  #pathInfo: "/confirm"
  #requestUri: "/confirm"
  #baseUrl: ""
  #basePath: null
  #method: "POST"
  #format: null
  #session: Store {#399 ▶}
  #locale: null
  #defaultLocale: "en"
  -isHostValid: true
  -isForwardedValid: true
  basePath: ""
  format: "html"
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2018/06/25 14:14

    1つ前の質問も私は公式リファレンスを読んで回答しています。つまり公式リファレンスをきちんとおさえていれば余程テクニカルな内容で無い限り、質問する程の内容ではないことも多々あるわけです。

    キャンセル

  • mts10806

    2018/06/25 14:30 編集

    ちなみにですが、実際にPOST情報を受け取っている箇所やactionに指定されているconfirmで行っているを提示しないと現在の提示コードだけでは確実な(的確な)回答はのぞめないと思います。

    キャンセル

  • takanori2018

    2018/06/25 14:43

    ありがとうございます。フォームが送られる側の確認画面での処理・バリデーターの処理・ddコマンドの出力を記載しました。

    キャンセル

回答 1

checkベストアンサー

+3

公式リファレンスにちゃんと受け取り方書いてありますよ。

これは前回質問時点できちんとおさえておかなければならないことなんですが、
$requestにタイプヒンティングでRequestというのがついていますよね。
ということは$requestはRequestというオブジェクトとして渡されていることが分かります。
つまり次に使おうとしているarrayではありません。
これも公式リファレンスをきちんと読んでいけば分かることでもありますが、Request=$_POSTそのものではありません。(Request=$_REQUESTそのものでもないです)

Laravel側でコントロールされているオブジェクトなので、Laravelのお作法にならって利用する必要があります。

前回質問で私が回答した内容をきちんと読まれましたか?
最後にバリデーションについてのリンク(公式マニュアル)も貼っています。
そこを読めていればおそらくこの質問をおこすことなく解決できたように思いますよ。

初心者であると自覚されているなら尚更、公式リファレンスを読み漁って自身のコードに反映させていくべきと思います。
フレームワークにはきちんとお作法があるので、それを無視して自分がやりたいようにやっていては期待した動作はしません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/25 15:47

    おっしゃる通りタイプヒンティングをもう一度見直したら、バリデーションが起動するようになりました。

    キャンセル

  • 2018/06/25 15:51

    公式マニュアル最優先で学習してください。
    同程度の質問に対して結局「マニュアル読んで」という回答しか来なくなります。
    ということは質問して回答を待つのは時間の浪費になります。
    (回答するしないは回答者の判断ですが、回答者の時間をとっていることもお忘れなく)

    キャンセル

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

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

関連した質問

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

  • PHP

    19882questions

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

  • Laravel

    646questions

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