【问题标题】:Laravel 4: create comment for a specific postLaravel 4:为特定帖子创建评论
【发布时间】:2013-08-14 15:56:31
【问题描述】:

我正在制作一个包含帖子和 cmets 的简单博客。资源评论是帖子的嵌套资源。这是路线:

Route::resource('posts', 'PostsController');
Route::resource('posts.comments', 'CommentsController');

到目前为止,我管理所有 Post crud 并查看属于某个帖子的所有 cmets。

但我不知道如何为帖子创建评论。

在我的 CommentsController 我有 RESTful 方法创建:

class CommentsController extends BaseController {

  protected $comment;


public function __construct(Comment $comment)
{
     $this->comment = $comment;
 }

public function create($post_id)
{
    return View::make('comments.create');
}

这是我为评论创建的视图:

@extends('master')

@section('blog')

<div class="span12 well">
  <h4>Make a Comment</h4>
</div>
<div class="span12 well">

  {{ Form::open(array('route' => 'comments.store')) }}

  {{ Form::close() }}
</div>
@stop

但它不起作用。我收到此错误:

无法为命名路由“cmets.store”生成 URL 路线不存在。

我也尝试make('route' =&gt; 'posts.comments.store')),我得到这个错误:

缺少一些强制参数(“posts”)来生成 URL 路由“posts.cmets.store”。

有人可以帮帮我吗?

编辑: 这是我的评论模型:

class Comment extends Eloquent 
{
    protected $guarded = array();

    public function post()
    {
        return $this->belongs_to('Post');
    }
}

这是我的帖子模型:

class Post extends Eloquent
{
    protected $guarded = array();
    public static $rules = array(
        'title' => 'required',
        'body' => 'required');

    public function comments()
    {
        return $this->hasMany('Comment');
    }
}

【问题讨论】:

    标签: php nested laravel laravel-4 blogs


    【解决方案1】:

    拥有

    Route::resource('posts', 'PostsController'); 
    Route::resource('posts.comments', 'CommentsController');
    

    您有 2 个商店路线选项:

    posts.store
    

    posts.comments.store
    

    但不是

    comments.store
    

    编辑:

    如果您查看您的路线(执行php artisan routes),您会看到到posts.cmets.store 的路线是:

    GET /posts/{posts}/comments/create
    

    因此,要使此路由正常工作,您需要在为该特定路由创建 url 时传递 Post id。这就是你在Form::open() 中的做法:

    {{ Form::open(array('route' => array('posts.comments.store', $post_id))) }}
    

    您还需要调整控制器以使其将帖子 ID 传递给您的视图:

    public function create($post_id)
    {
        return View::make('comments.create')->with('post_id', $post_id);
    }
    

    【讨论】:

    • 感谢您的回复。这两个选项都不起作用。如果我制作posts.store,我会收到验证错误,因为正在尝试填写帖子表单的字段(虽然这是评论表单)。使用posts.cmets.store我得到这个错误:缺少一些强制参数(“posts”)来为路由“posts.cmets.store”生成一个URL。
    • 感谢安东尼奥的回复!我做到了,但它不起作用。我仍然得到:缺少一些强制参数(“posts”)来生成路由“posts.cmets.store”的 URL。我不知道,可能是其他地方的问题?我编辑问题以编写两个模型。问题似乎出在 Create comment 视图中调用 posts.cmets.store 时。没有它,页面会正确打开。如果我尝试编辑或显示单个评论,我会遇到同样的问题,我会收到同样的错误。
    • 我的错。忘记在路由中添加数组声明。刚刚修好了。
    • 非常感谢!现在我解决了这个问题!我可以问最后一个问题吗?在 store 方法中,保存新评论后,我想重定向到路由 cmets.index,以及该指定帖子的所有 cmets。所以我做了: return Redirect::route('posts.cmets.index');但我收到此错误:缺少一些强制参数(“posts”)以生成路由“posts.cmets.index”的 URL。在这种情况下我该怎么办?
    • 再一次,由于您的路线基于特定的 Post,您必须将 post_id 传递给 Redirect:Redirect::route('posts.comments.index', $post_id);
    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2014-05-10
    • 1970-01-01
    • 2014-06-11
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多