LoginSignup
sanchunaka
@sanchunaka (naka sunchu)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

<a href="{{ action('PostsController@show', $post) }}">{{ $post->title }}</a>をlaravel8用に書き換えるには

Q&AClosed

解決したいこと

ドットインストールで勉強中です。

<li><a href="{{ url('/posts', $post->id) }}">{{ $post->title }}</a></li>

ではエラーは出ません。

15のindex.blade.phpで以下のコードを
laravel8用に書き換えたいのですが、うまくいきません。

<li><a href="{{ action('PostsController@show', $post) }}">{{ $post->title }}</a></li>

試したこと
その1

<li><a href="{{ action([PostsController::class,'show'], $post) }}">{{ $post->title }}</a></li>

その2

<li><a href="{{ action(([PostsController::class,'show']), $post) }}">{{ $post->title }}</a></li>

解決方法を教えて下さい。

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

InvalidArgumentException
Action PostsController@show not defined. (View: C:\Users\hirok\laravel_lessons\myblog\resources\views\posts\index.blade.php)
http://192.168.56.1:8000/ 

該当するソースコード

//web.php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostsController;

Route::get('/', [PostsController::class,'index']);

//Route::get('/posts/{id}', [PostsController::class,'show']);

Route::get('/posts/{post}', [PostsController::class,'show']);

//index.blade.php

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Blog Posts</title>
  <link rel="stylesheet" href="/css/styles.css">
</head>
<body>
  <div class="container">
    <h1>Blog Posts</h1>
    <ul>
      {{--
      @foreach ($posts as $post)
      <li><a href="">{{ $post->title }}</a></li>
      @endforeach
      --}}
      @forelse ($posts as $post)
      <!-- <li><a href="">{{ $post->title }}</a></li> -->
        <!-- <li><a href="/posts/{{ $post->id }}">{{ $post->title }}</a></li> -->
        <!-- <li><a href="{{ url('/posts', $post->id) }}">{{ $post->title }}</a></li> -->
                <!-- <li><a href="{{ action('PostsController@show', $post->id) }}">{{ $post->title }}</a></li> -->
        <li><a href="{{ action('PostsController@show', $post) }}">{{ $post->title }}</a></li>
        @empty
      <li>No posts yet</li>
      @endforelse
    </ul>
  </div>
</body>
</html>

//PostsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Post;

class PostsController extends Controller
{
    public function index() {
      // $posts = \App\Post::all();
      // $posts = Post::all();
      // $posts = Post::orderBy('created_at', 'desc')->get();
      $posts = Post::latest()->get();
      // $posts = [];
      // dd($posts->toArray()); // dump die
      // return view('posts.index', ['posts' => $posts]);
      return view('posts.index')->with('posts', $posts);
    }

    public function show($id) {
      // $post = Post::find($id);
      $post = Post::findOrFail($id);
      return view('posts.show')->with('post', $post);
    }
}


//show.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>{{ $post->title }}</title>
  <link rel="stylesheet" href="/css/styles.css">
</head>
<body>
  <div class="container">
    <h1>{{ $post->title }}</h1>
    <p>{!! nl2br(e($post->body)) !!}</p>
  </div>
</body>
</html>

0

1Answer

Bladeで使用する場合、おそらく名前空間をすべて記載する必要があると思います。

action('App\Http\Controllers\PostsController@show', $post)

私は名前付きルートを使用するのでaction()は使ったことが無いですね。

0

Your answer might help someone💌