Listado de posts
Voy a mostrar un listado con los pos almacenados en la base de datos, para ello debo empezar creando un controlador en el que recogeré una variable con los post y desde donde llamar a una vista para mostrarlos. Creo un controlador llamado PostController.
| 1
 | enrique@enrique-server:/var/www/laravel/blog_laravel$ php artisan make:controller PostController
 | 
 
entro en la clase app/Http/Controllers/PostController.php y la edito como he dicho anteriormente
PostController.php
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 | <?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
    public function index()
    {
        $posts = Post::where('status', 2)->get(); // Filtro para que solo recoga los publicados
        return view('posts.index', compact('posts'));
    }
}
 | 
 
Creo la vista  resources/views/posts/index.blade.php en la que extiendo la plantilla principal app/View/Components/AppLayout.php.
index.blade.php
| 1
2
3
4
5
6
7
8
 | <x-app-layout>
@foreach ($posts as $post)
    <p>{{$post->name}}</p>
@endforeach
    
</x-app-layout>
 | 
 
En el controlador de rutas le asigno el control de la ruta principal del blog al controlador PostController.
web.php
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
 | <?php
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
Route::get('/', [PostController::class, 'index'])->name('posts.index');
Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
    return view('dashboard');
})->name('dashboard');
 | 
 
Por si acaso refresco la cache de las rutas.
| 1
 | enrique@enrique-server:/var/www/laravel/blog_laravel$ php artisan route:cache
 | 
 
Voy a crear una clase personalizada para dar los estilos comunes a todo el proyecto. Me apoyo en laravelmix para conseguirlo. Creo el archivo resources/css/common.css que contendrá mis clases personalizadas.
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 | .micontainer{
    @apply max-w-7xl mx-auto px-2;
}
@media(min-width:640px){
    .micontainer{
        @apply px-6;
    }
}
@media(min-width:1024px){
    .micontainer{
        @apply px-8;
    }
}
 | 
 
Para que laravel reconozca el archivo commom.css debo importarlo dentro de resources/css/app.css
app.css
| 1
2
3
4
5
 | @import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
@import 'commom.css';
 | 
 
Compilo los cambios desde la terminal
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 | enrique@enrique-server:/var/www/laravel/blog_laravel$ npm run dev
> @ dev /var/www/laravel/blog_laravel
> npm run development
> @ development /var/www/laravel/blog_laravel
> cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --config=node_modules/laravel-mix/setup/webpack.config.js
98% after emitting SizeLimitsPlugin
 DONE  Compiled successfully in 59375ms                                                                                                                                                       11:06:21 AM
       Asset      Size   Chunks             Chunk Names
/css/app.css  4.38 MiB  /js/app  [emitted]  /js/app
  /js/app.js   669 KiB  /js/app  [emitted]  /js/app
 | 
 
Quiero mostrar los post de forma paginada y solo 8 cada vez por lo que modifico el método index dePostController.php
PostController.php
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 | <?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
    public function index()
    {
        $posts = Post::where('status', 2)->latest('id')->paginate(8);
        return view('posts.index', compact('posts'));
    }
}
 | 
 
Modifico la vista para que me muestre la imagen de cada post, su titulo y las etiquetas que posee. LE añado tambien la paginacion y lo hago responsive.
index.blade.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
27
 | <x-app-layout>
    <div class="micontainer py-8">
        <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> <!-- Añado md: y lg: para hacerlo responsive-->
            @foreach ($posts as $post)
                <article class=" w-full h-80 bg-cover bg-center @if($loop->first) md:col-span-2 @endif" style="background-image: url({{Storage::url($post->image->url)}})">
                    <div class=" w-full h-full px-8 flex flex-col justify-center">
                        <div>
                            @foreach ($post->tags as $tag)
                        <a href="" class=" inline-block px-3 h-6 bg-{{$tag->color}}-600 text-white rounded-full">{{$tag->name}}</a>
                            @endforeach
                        </div>
                        <h1 class=" text-4xl text-white leading-8 font-bold">
                            <a href="">
                                {{$post->name}}
                            </a>
                        </h1>
                    </div>
                </article>
            @endforeach
        </div>
        <div class=" mt-4">
            {{$posts->links()}}
        </div>
    </div>
    
</x-app-layout>
 |