如何从控制器中的函数在一个部分内呈现单个 post

How to render a single post inside a section, from a function in the controller

我正在开发一个个人博客,但我无法让浏览器向我展示我在尚未向我展示单个 post 的功能中拥有的内容,但我可以设法查看一个所有 post 的列表,我只能查看出现在主主页上的 5 个(最新)。

现在,我将转到您单击标题的部分,然后应显示有关此 post 的所有内容。我检查了我遇到问题的部分的代码以及没有将 foreach 呈现给浏览器的部分,也许我没有在 blade 部分做正确的事情?

PostsController.php

    public function show(Post $slug)
    {
        $post = Post::find($slug);
        return view('posts.show', ['posts' => $post]);
    }

Posts/show.blade.php

@extends('layouts.app')

@section('showpost')

    <div>
        @foreach ($posts as $post)
            <h1> {{ $post->title }} </h1>
            <p> {{ $post->body }} </p>
        @endforeach
    </div>

@endsection

web.php

Route::get('/posts/{post}', 'PostsController@show');

只是为了向您展示我是如何引用仅显示一个 post 的模板的。

            @foreach ($posts as $post)
            <li>
                <a href="/posts/{{ $post->slug }}">
                    <h1> {{ $post->title }} </h1>
                </a>
                <p> {{ $post->slug }} </p>
            </li>
            @endforeach

Post::find 用于通过其主键检索模型,该主键在大多数情况下名为 id。在你的情况下继承人你将 $slug 作为参数传递,并且因为它应该只呈现具有给定 slug 的单个项目你应该使用 Post::where('slug', $slug)->first() 这只会 return 一项,您将不必在 show.blade.php 模板中使用 foreach 循环。

这里还有一个问题

public function show(Post $slug) {
    $post = Post::find($slug);
    return view('posts.show', ['posts' => $post]);
}

您正在使用 Route Model Binding,它将自动设置函数 show 的参数 $slug 等于 posts table 中的记录在 URL 请求中传递的 id。无需执行Post::find($slug)

例如,如果请求 URL 是 http://localhost:8000/posts/1 这里 id1 所以参数$slug 将填充具有 id==1 的记录,除非您像这样自定义密钥

App\Models\Post::class中定义一个方法调用

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

使用此定义,在执行路线模型出价时将检索的 post 项目将基于 posts [=54= 中的 slug 列的值].

您可以在 Route Model Biding

了解更多信息

为了完整的实现Route Model Binding,需要在3处指定,routes.php,PostsController.php 并在模型上覆盖它,Post.php:

  1. 在 get 请求方法中传递所需的目标并将其放在通配符中,这是在您指定控制器的位置以及在控制器内部使用哪个函数的旁边。

来自:Route::get('/posts/{post}', 'PostsController@show');

为此:Route::get('/posts/{slug}', 'PostsController@show');

  1. 使用 getRouteKeyModel 函数覆盖目标(从 id 到“任何”),这就像@Yves Kipondo 提供的那样
/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

调整PostsController 中的show 函数,传递模型的名称和目标以便完成查询。所有这些都在函数的参数中。并且由于您覆盖了 id 的使用,因此您不再需要在 Eloquent 查询数据库中指定它。

所以,而不是这个:

    public function show(Post $slug)
    {
        $post = Post::find($slug);
        return view('posts.show', ['posts' => $post]);
    }

改成这样:

    public function show(Post $slug)
    {
        return view('posts.show', ['post' => $slug]);
    }