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

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

ただいまの
回答率

88.10%

laravelでの画面遷移について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,816

score 27

プログラミング独学三か月、Laravel初心者です。
突如プロジェクトに参加し、Laravelを正式に使用しなければいけなくなりました。
勉強と解読同時に進めているのですがどうしても先に進めなくなってしまったので、お力添えいただけますと幸いです。

■実現したいこと
画面の遷移をしたい
(sectionController.phpのfunctionは既に記載済みだったのでview.bladeに正しいリンクがはれれば実現可能だと思われる)

■試したコード
当方記載コード(ミスはおそらくここ)

<a href="{{ route('admin.sections.create') }}"
   class="btn btn-primary">セクション</a>

前任者の書いたコード

 /*
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
    public function create(Request $request)
{
    $id = $request->query('id');
    $date = $request->query('date');
    //パラメータ
    if(empty($id) || empty($date)) {
        return redirect()->route('admin.home');
    }  
    return view('section.create')->with($_param + compact('section'));
}


■結果
'admin.home'に遷移してしまった(return view('section.create')にしたい)

■原因予測
return redirect()->route('admin.home');とあるのでパラメータの$idと$dateの情報が送れていない

■質問
どのように記載すれば$idと$dateの情報が送れるのか

■参考
HTTPリクエスト
5.5でひとつ古いバージョンですが、見やすかったのでこちら参照しました。
functionのかきかたはありましたが、view側の記載がなく、実装できませんでした。

■環境
Laravel5.6 windows10

■質問追記
そもそもpublic function create(Request $request)の引数として$idと$dateを渡すということが見当違いなのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+1

見やすかったのでこちら参照しました。

マイナーバージョンでも1つ違うと適用できなくなるので
「みやすいから」と自己都合で勝手に別のバージョンの情報を参照するのは事故の元です。
きちんと自身が利用しているバージョンのドキュメントを確認してください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/14 16:10

    いろいろ検索書けましたらバージョンが変わる=機能追加ではないのですね。
    完全に対応しない仕様もあるということを初めて知りました。
    ご指摘ありがとうございます。

    キャンセル

  • 2019/02/14 16:14

    互換性が100%保証されるものではないですし、
    バージョンが違う資料を見ていたらそれは何か問題かあっても文句は言えないです。
    ドキュメントがバージョンで別にできるということはそれなりの理由があります。

    キャンセル

+1

$request->query


これはクエリ文字列からデータを取得するコードです。クエリ文字列は何なのかというと、

https://teratail.com?id=1

こういうurlの末尾のパラメーターの事ですね。
つまり前任者のプログラムとしては、idとdataパラメーターを渡して欲しいわけです。

Undefined variable: id

このエラーはidパラメーターを渡していないから表示されているわけですね。

名前付きルートでの値の渡し方は、

{{ route('admin.sections.create',['id' => 1, 'data'=>'text']) }}

こんな感じです。

追記

前任者が書いたプログラムにをみてください。

$id = $request->query('id');
$date = $request->query('date');

これは何をしているのかというと、「idというクエリ文字列」と「dateというクエリ文字列」を取得しようとしています。もし取得しようとしているクエリ文字列がなかったら、当然エラーが出ますよね。ないものは取得しようがありません。なのでidとdateが必要というわけです。

そして

(request $request)に対してパラメーターを渡す。

という認識は少し違います。これは「Illuminate\Http\Request」クラスを依存注入しているのです。

$request->query

というのは、簡単にいえばRequestクラスのqueryメソッドを使っているということになります。queryメソッドは送られてきたクエリ文字列を取得する処理が書かれているというわけです。

依存注入についてはこちらに詳しく書かれていますが、もしかしたらphpに置けるオブジェクト指向をもう少し学ばれた方が良いかもしれません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/14 16:41

    画面が推移した先の最初の処理、

    $id = $request->query('id');

    で引っかかっているからですね。ここでidを取得しようとして、idパラメーターがないとエラーになるわけです。試しに$idだけ渡して$dateを抜いてみてください。今度は$dateでエラーが出るはずです。

    キャンセル

  • 2019/02/15 10:08

    たしかし$dateでえらーでました。
    そもそも引数として(request $request)に対してどのパラメーターを受け渡すのか、の判断ができないでうすが、idとdateを渡すという認識自体は合っているのでしょうか?

    キャンセル

  • 2019/02/15 10:50

    難しくて現状解読は困難ですが情報ありがとうございます。

    キャンセル

check解決した方法

0

{{ route('admin.section.create', ['id' => $project->getId(), 'date' => $date->date->format('Ymd')]) }

回答でも頂いていたようにURLの設定をみて、パラメータを判断。
コントローラやヴューコンポーザなどに散りばめられていた情報を拾って上記の式になった。

サービスコンテナ公式ドキュメント参照
依存注入が正直まだ理解しきれていないところがあるため、現状これ以上詳しく加筆できません。
随時更新します。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/15 20:20

    閉じずにきちんと整理してから投稿すべきかと。誰も急いでませんよ

    キャンセル

0

route('admin.sections.create', [
  'id' => $id,
  'date' => $date,
])

見るならこっち
https://readouble.com/laravel/5.5/ja/urls.html

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/14 14:09

    参考ページありがとうございます。
    Undefined variable: idのエラーが発生してしまったのですが、何が原因でしょうか?

    キャンセル

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

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

関連した質問

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