replica410
@replica410 (陽 有村)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Laravelで作成したトップページでのパラメーターエラーについて

解決したいこと

ここに解決したい内容を記載してください。

Laravelを使ってフリーマーケットサイトを作成しています。
そのサイトのトップページに飛ぶ際に毎回、リンク先として書いているshow.blade関連でパラメーターのエラーが出てしまい、一度違うページに飛んでからトップページに飛ばないといけない状態です。
既にログイン関連のルートは書き終えています。
トップページはログインしないと飛べない状態にしたいです。
ログイン前にトップページに飛んだ際に、ログイン用のページに飛ぶようにしたいです。

発生している問題・エラー

Missing required parameters for [Route: profile.show] [URI: profile/{profile}]. (View: /home/ec2-user/environment/laravel_market/resources/views/layouts/top.blade.php)

### 該当するソースコード
```web.php(ルーティング)
<?php

/*
|--------------------------------------------------------------------------
| 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!
|
*/
Auth::routes();

Route::get('/', function () {
    return view('layouts.top');
});
// お気に入り一覧
Route::resource('likes', 'LikesController')->only([
    'index', 'store', 'destroy'
]);

Route::resource('items', 'ItemsController');

Route::resource('profile', 'ProfileController')->only([
    'store', 'destroy'
]);
Route::get('users/{id}/exhibitions', 'ItemsController@exhibitions');

Route::get('items/create', 'ItemsController@create');

Route::post('items', 'ItemsController@store');

Route::get('/profile/{id}/edit', 'ProfileController@edit')->name('profile.edit');
Route::patch('/profile/{id}', 'ProfileController@update')->name('profile.update');
Route::get('/profile/{id}/edit_image', 'ProfileController@editImage')->name('profile.edit_image');
Route::patch('/profile/{id}/edit_image', 'ProfileController@updateImage')->name('profile.update_image');

Route::resource('profile', 'ProfileController')->only([
  'show',
]);
show.blade.php(プロフィール画面のビュー)
<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use App\User;
use App\Items;
use App\Http\Requests\ProfileRequest;
use App\Http\Requests\ProfileImageRequest;
use App\Services\FileUploadService;
 
class ProfileController extends Controller
{
    // プロフィール
    public function show($id)
    {
        $user = User::find($id);
        return view('profile.show', [
          'title' => 'プロフィール',
          'user' => $user
        ]);
    }
    
    public function edit(int $id)
    {
        $user = User::find($id);
        return view('profile.edit',[
            'title' => 'プロフィール編集',
            'user' => $user,
        ]);
    }
    
    public function update(int $id, UserRequest $request){
        $user = User::find($id);
        $user->update($request->only(['name', 'profile']));
        session()->flash('success', 'プロフィールを編集しました!');
        return redirect()->route('profile.show', $id);
    }
    
    public function editImage($id)
      {
        $user = User::find($id);
        return view('profile.edit_image', [
          'title' => 'プロフィール画像変更画面',
          'user' => $user,
        ]);
      }
    
          public function updateImage($id, ProfileImageRequest $request, FileUploadService $service)
    {
          
          //画像投稿処理
          $path = '';
          $image = $request->file('image');
          
          if(isset($image) === true){
              // publicディスク(storage/app/)のphotosディレクトリに保存
              $path = $image->store('photos', 'public');
          }
          
          $user = User::find($id);
          
          // 変更前の画像の削除
          if($user->image !== ''){
              // publicディスクから、該当の投稿画像($user->image)を削除
              \Storage::disk('public')->delete(\Storage::url($user->image));
          }
          
          $user->update([
            'image' => $path, //ファイル名を保存    
          ]);
          
          session()->flash('success', '画像を変更しました!');
          return redirect()->route('profile.show', $id);
      }
      
      private function saveImage($image){
                // 画像投稿処理
          $path = '';
          if(isset($image) === true ){
               // publicディスク(storage/app/)のphotosディレクトリに保存
               $path = $image->store('photos', 'public');
          }
          return $path;; // 画像が存在しない場合は空文字
      }


    // いいね追加処理
    public function store(Request $request)
    {
        //
    }
 
    // いいね削除処理
    public function destroy($id)
    {
        //
    }
}
top.blade.php(トップページのビュー)
@extends('layouts.default')
 
@section('header')
<header>
    <ul class="header_nav">
        <li>
            <a href="/">
            Market
            </a>
        </li>
        <li>
            <a href="{{ route('profile.show', Auth::id()) }}">
            プロフィール
          </a>
        </li>
        <li>
          <a href="/likes/index">
            お気に入り一覧
          </a>
        </li>
        <li>
            <a href="/users">
                出品商品一覧
            </a>
        </li>
            <form action="{{ route('logout') }}" method="POST">
                @csrf
                <input type="submit" value="ログアウト">
            </form>
    </ul>
</header>
@endsection

自分で試したこと

ルーティングの見直し、パラメーターの渡し方

0

4Answer

Comments

  1. @replica410

    Questioner

    修正しましたが最初と同様のパラメーターエラーが出ます。書き換えて試して頂いた際にエラーが発生せず動きましたか?
  2. @replica410

    Questioner

    回答を頂けないようなのでブロックします。

トップページはログインしないと飛べない状態にしたい

ドキュメントの「ルートの保護」が該当すると思いますが、こちらは読まれましたか?

0Like

Comments

  1. @replica410

    Questioner

    直接読んではいませんが、同じ内容を別の教材で読んで知ってはいます。
    一応、ProfileControllerにconstruct()を記載していたのですが、色々と書き込んだり消したり試している現段階で一時的に削除していました。
  2. 質問について確認させてください。

    エラーの直接的な原因は、エラーメッセージが示す通りパラメータ不足です。
    そのパラメータを指定するにはログインが必要があるので「ログインしないと飛べない状態にしたい」というゴールがあるのだと解釈しているのですが合っていますか?
  3. @replica410

    Questioner

    そうですね。
    ゴールとしては、ログインした場合にのみトップページが表示され、その後プロフィールのリンクを押した際にそのログインユーザーのプロフィールに飛ぶ流れにしたいです。
    ですが、現在エラーメッセージのようにプロフィールのビューであるshow.bladeでパラメーター関連のエラーによりトップページが表示できない状態となっています。
  4. 問題が2つあり、どちらについて回答すべきなのか判断しかねています。
    パラメータについては他の方が回答されているようなので、そちらに譲ることにします。
  5. @replica410

    Questioner

    もし余裕があればで宜しいのですが、パラメーター側も教えて頂けると助かります。
    丁度、昨日頂いたエラーが出ないと聞いたやり方を試して上手くいかずに手詰まりになってしまっている状態なので
  6. @replica410

    Questioner

    回答を頂けないようなのでブロックします。

Comments

  1. @replica410

    Questioner

    恐らくその通りで、URLでパラメーターを渡そうとしているのにルーティング中に渡す処理を行っていないとのエラーなのですが、ルーティング段階で渡そうとしたりコントローラーで渡そうとしてもエラーが出てしまうので質問している次第です。
  2. トップページのshowのリンクが問題なんじゃないでしょうか?
  3. @replica410

    Questioner

    恐らくそうです、そこでルート名のみでidを渡せていないから飛ぶ際にエラーが出てるのかなと思うのですが、その書き方が分からず困っています。
  4. トップページからどんなidのshowにリンクさせたいんでしょうか
  5. @replica410

    Questioner

    流れで言いますと、そもそもトップページがログイン状態でないと見れない状態にしたくて、そこからshow(プロフィールの最初のページ)に飛んだ際にログインしたユーザーのidと同じidで飛んでログインした人のプロフィールを表示させるという形にしたいです。
  6. 「ログインしたユーザーのidと同じid」ってなんでしょうか?
    非ログインユーザーにshowのページに飛んでもらいたいんですよね
  7. @replica410

    Questioner

    いえ、プロフィールのビューであるshowはトップページのURLを入力した際にログインページにてログインしたユーザーのページに飛んで欲しいです。
    つまりログインができたらトップページを表示、そのログインユーザーのプロフィールページに飛べるという流れを目指しています。
    自分の考えがそもそも間違っていたら申し訳ないのですが、トップページの表示前にログインを済ませる場合、プロフィールのビューをshowで作る必要もidをURLで渡す必要も無いのでしょうか?
  8. それならログインユーザーのidをshowのリンクに渡す必要がありますね
    それかログインユーザーのIDの取得方法が分からないということなんでしょうか?
  9. @replica410

    Questioner

    ログインユーザーの取得方法は、今のエラーが出る状態でも直接プロフィール編集ページなどに行った際に問題なくログインページ(名前やメールアドレスを入力する画面)が表示されるので行けてるかなと思っています。
    ただ、プロフィール画面であるshow,bladeへのリンクが書かれたトップページがshow.blade絡みでパラメーターに関するエラーを出してしまっているので、トップページでの書き方が悪いかshow,bladeのルーティングのどこかでちゃんとidが渡せていないのかなと直し方を悩んでいる状態です。

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌