如何从控制器中的函数在一个部分内呈现单个 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
这里 id 是 1 所以参数$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:
- 在 get 请求方法中传递所需的目标并将其放在通配符中,这是在您指定控制器的位置以及在控制器内部使用哪个函数的旁边。
来自:Route::get('/posts/{post}', 'PostsController@show');
为此:Route::get('/posts/{slug}', 'PostsController@show');
- 使用 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]);
}
我正在开发一个个人博客,但我无法让浏览器向我展示我在尚未向我展示单个 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
这里 id 是 1 所以参数$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:
- 在 get 请求方法中传递所需的目标并将其放在通配符中,这是在您指定控制器的位置以及在控制器内部使用哪个函数的旁边。
来自:Route::get('/posts/{post}', 'PostsController@show');
为此:Route::get('/posts/{slug}', 'PostsController@show');
- 使用 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]);
}