Vamos añadir la posibilidad a los usuarios logueados de comentar en los posts.
Primero tenemos que añadir la tabla comentarios en la base de datos. Para eso, como siempre, tenemos que crear una migración:
1 |
php artisan make:migration create_comments_table |
Con este contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCommentsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('comments', function (Blueprint $table) { $table->increments('id'); $table->text('body'); $table->integer('user_id')->references('id')->on('users')->onDelete('cascade'); $table->integer('post_id')->references('id')->on('posts')->onDelete('cascade'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('comments'); } } |
Y la ejecutamos.
Una vez tenemos esto, tenemos que crear el controlador y el modelo para los comentarios. Laravel nos permite hacer esto simplemente con un comando:
1 |
php artisan make:controller CommentsController --model=Comment |
Abrimos el modelo Comment.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; use App\Presenters\DatePresenter; class Comment extends Model { use DatePresenter; // fields can be filled protected $fillable = ['body', 'user_id', 'post_id']; public function post() { return $this->belongsTo('App\Post'); } public function user() { return $this->belongsTo('App\User'); } } |
Añadimos las relaciones con comentarios en los modelos de Post.php y User.php :
1 2 3 4 |
public function comments() { return $this->hasMany('App\Comment'); } |
1 2 3 4 |
public function comments() { return $this->hasMany('App\Comment'); } |
Cuando hayas puesto esto, ya podremos acceder a los comentarios de un posts y a los comentarios de un usuario fácilmente.
Vamos al controlador y añadimos el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php namespace App\Http\Controllers; use App\Comment; use App\Post; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; use App\Http\Requests\CommentRequest; class CommentsController extends Controller { public function __construct() { $this->middleware('auth'); } public function store(CommentRequest $request) { $post = Post::findOrFail($request->post_id); Comment::create([ 'body' => $request->body, 'user_id' => Auth::id(), 'post_id' => $post->id ]); return redirect()->route('posts.show', $post->id); } } |
Sólo ponemos el método store, que es el que crea el comentario en la base datos, más tarde le añadiremos más funcionalidades.
Antes de continuar, deberemos modificar la ruta que muestra el detalle de un post y añadirle un nombre:
1 |
Route::get('/post/{id}', 'PostsController@show')->name('posts.show'); |
Ahora, creamos el Form Request para validar la información enviada del comentario que queremos insertar ( php artisan make:request CommentRequest) y añadimos este código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class CommentRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return \Auth::check(); } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'body' => 'required|max:1000', ]; } } |
Comprueba que el usuario esté logueado y que el comentario tenga contenido y que sean máximo 1000 caracteres.
Falta la ruta:
1 |
Route::resource('comments', 'CommentsController'); |
Si te fijas, hemos añadido la ruta de otra manera. Esta forma añade todas las rutas automáticamente, sin tener que ir una por una.
Añadimos el formulario y la lista de comentarios del post concreto a la vista:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<h3>Comments</h3> @if (Auth::check()) @include('includes.errors') {{ Form::open(['route' => ['comments.store'], 'method' => 'POST']) }} <p>{{ Form::textarea('body', old('body')) }}</p> {{ Form::hidden('post_id', $post->id) }} <p>{{ Form::submit('Send') }}</p> {{ Form::close() }} @endif @forelse ($post->comments as $comment) <p>{{ $comment->user->name }} {{$comment->created_at}}</p> <p>{{ $comment->body }}</p> <hr> @empty <p>This post has no comments</p> @endforelse |
Y si queremos, podemos añadir el número de comentarios que tiene un post en la lista de posts:
1 |
<span>{{$post->comments->count()}} {{ str_plural('comment', $post->comments->count()) }}</span> |
La función str_plural nos ayuda a transformar en plural una cadena de texto según el número que le pasemos.
Buen día,
Excelente tutorial, lo he estado siguiente al pie de la letra pero tengo un problema cuando voy a ver algún comentario sale el siguiente error
Route [posts.show] not defined.
Igualmente sale error cuando coloco la línea en la vista de posts:
{{$post->comments->count()}} {{ str_plural(‘comment’, $post->comments->count()) }}
Gracias por su ayuda.
Hola Meissner,
Ese error es porque te falta añadir el name a la ruta que muestra el detalle de un post.
Ya he modificado la entrada, parece ser que me había olvidado de incluir la modificación.
Saludos!
muy bueno
Muchas gracias! ?
Hola amigo como hago para que un comentario sea publicado o no . o mas bien moderar cada comemtario de ante mano muchas gracias por tu gran ayuada saludos!!
Hola Mauro!
Muchas gracias por tu comentario.
Lo que podrías hacer es crear un campo tipo integer en la tabla de comentarios que se llame status. Entonces, cada valor corresponderá un estado: 0 = no publicado, 1 = en revisión, 2 = publicado, etc, por ejemplo. Y cuando muestras los comentarios filtras por este campo según lo que quieras obtener.
Espero haberme explicado y que te sea de gran ayuda.
ok.muchas gracias lo hare haber si me funciona saludos y gracias por compartir tus conocimientos,que Dios te bendiga siempre.
De nada, un saludo
buen articulo