Crea una cuenta o inicia sesión

¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera

Curso de API REST con Laravel

Curso de API REST con Laravel

Profesor Italo Morales F

Profesor Italo Morales F

Construcción y Evolución de un Sitio Web con API en Laravel

3/18
Recursos

¿Cómo construir un sitio web que evoluciona a un API?

Crear un sitio web que con el tiempo evolucione para incluir un API es un objetivo común en el desarrollo de software moderno. Con los requisitos empresariales y tecnológicos siempre cambiantes, los desarrolladores deben construir plataformas que no solo cumplan las necesidades actuales, sino que también sean flexibles para adaptarse a demandas futuras. En esta guía, te mostraré cómo empezar a construir tu sitio web con Laravel e integrar gradualmente las funcionalidades necesarias para convertirlo en un API.

¿Cómo instalar Laravel para comenzar el proyecto?

Laravel es uno de los frameworks más populares para crear aplicaciones web con PHP. Comenzamos utilizando el terminal de Visual Studio para instalar una versión fresca de Laravel. Aquí te muestro el comando y el proceso para comenzar el proyecto:

# En el terminal de Visual Studio
cd carpeta-de-mis-sitios
Laravel new API

Este comando descarga una nueva copia de Laravel en su versión más reciente, sin incluir el JetStream, que es un componente adicional que ayuda con características avanzadas.

¿Cómo crear los componentes necesarios para el proyecto?

Una vez descargado Laravel, es momento de implementar los componentes básicos del proyecto. Usamos el comando artisan de Laravel, que facilita tareas como la creación de modelos, controladores, migraciones y fábricas.

php artisan make:model Post -c -m -f

Al ejecutar este comando, hemos creado:

  • Modelo para Post: Define la estructura básica de tu entidad.
  • Migración: Sistema de control de versiones para la base de datos.
  • Factory: Herramienta para crear datos de prueba automáticamente.

¿Cómo configurar las migraciones y faux data?

Configurar correctamente las migraciones es crucial para gestionar correctamente las bases de datos. Aquí, nos enfocamos en la tabla de posts y cómo se relaciona con los usuarios:

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained('users');
    $table->string('título');
    $table->string('slug')->unique();
    $table->text('contenido');
});

Para asegurarte que tu aplicación cuente con la información necesaria para pruebas, usas faker en el factory para generar datos falsos:

public function definition()
{
    return [
        'user_id' => $this->faker->numberBetween(1, 10),
        'título' => $this->faker->sentence,
        'slug' => $this->faker->slug,
        'contenido' => $this->faker->text(1600)
    ];
}

¿Cómo se cargan los datos en la base de datos?

Una vez que tenemos nuestros modelos y migraciones, necesitamos poblar la base de datos. Usamos los comandos para ejecutar migraciones y sembrar datos:

# Ejecutar las migraciones y seed data
php artisan migrate --seed

Esto creará las tablas en la base de datos y llenará la tabla posts con 120 registros de prueba.

¿Cómo configurar las rutas y vistas?

Finalmente, configuramos las rutas web para conectar controladores y vistas. Este código genera una nueva ruta para mostrar los posts almacenados:

Route::get('/', [PostController::class, 'index']);

Debemos asegurarnos de tener el controlador configurado para manejar las solicitudes de manera adecuada:

public function index()
{
    $posts = Post::latest()->paginate(15);
    return view('index', compact('posts'));
}

Este controlador obtiene los posts más recientes paginados y los envía a la vista llamada index.

Reflexiones finales

Al integrar gradualmente los componentes para un API en un sitio web tradicional, te aseguras de que tu aplicación no solo cumpla con las necesidades actuales, sino que también sea expansiva. Comienza hoy a crear arquitecturas robustas y flexibles con la guía que he compartido, y verás lo satisfactorio que puede ser crear soluciones que evolucionen con el tiempo. Mantente motivado y sigue aprendiendo. ¡El futuro de la tecnología está en tus manos!

Aportes 22

Preguntas 13

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Les comparto el paso a paso:
Crear proyecto

laravel new api-8

Entrar a la carpeta y crear Model-Controller-Migration-Factory

cd api-8
php artisan make:model Post -cmf

migrations/…post

  public function up()
  {
    Schema::create('posts', function (Blueprint $table) {
      $table->id();

      $table->unsignedBigInteger('user_id');
      $table->string('title');
      $table->string('slug')->unique();
      $table->text('content');

      $table->timestamps();

      $table->foreign('user_id')->references('id')->on('users');
    });
  }

PostFactory.php

  public function definition()
  {
    return [
      'user_id' => rand(1,10),
      'title' => $this->faker->sentence,
      'slug' => $this->faker->slug,
      'content' => $this->faker->text(1600)
    ];
  }

DatabaseSeeder.php

  public function run()
  {
    \App\Models\User::factory(10)->create();
    \App\Models\Post::factory(120)->create();
  }

Comando de migración:

php artisan migrate --seed

Para crear mediante composer

composer create-project laravel/laravel API

Una pequeña sugerencia a la hora de crear llaves foraneas es la de utilizar el atributo de foreignId de esta forma te ahorras el tiempo de escribir unsignedBigInteger, permitiendo que tu código sea más rápido y legible de entender de esta forma 😄 :

$table->foreignId('user_id');

Esto es genial e importante, porque efectivamente estamos muy acostumbrados a siempre trabajar las rutas de Laravel directo en el archivo web.php, ¿pero no te has preguntado para qué son los otros archivos? 👀 Es ahora cuando empezaos a trabajar con api.php

Hola, les comparto una forma de crear los factory y que el slug realmente sea el slug del post, o sea… Si el titulo del post es “Hola Platzi” el slug sera ‘‘hola-platzi’’

En donde creamos el factory de Post primero declaramos:

use Illuminate\Support\Str;
use App\Models\User;

Despues donde creamos el factory:

public function definition()
    {
        //Definimos una frase falsa para el titulo
        $title = $this->faker->sentence;
        //Con Str llamamos al metodo slug y le pasamos el titulo
        $slug = Str::slug($title);
        //Creamos el factory
        return [
            //De esta forma obtenemos un usuario aleatorio y colocamos el ID (asi no dependemos de que los ids obligatoriamente sean del 1 al 10)
            'user_id' => User::all()->random()->id,
            'title' => $title,
            'slug' => $slug,
            'content' => $this->faker->text(1600),
        ];
    }

¿Soy el único que ve que el video se va trabando?

yo lo hago asi, importo la clase

use App\Http\Controllers\PostController;

Luego si lo importo de esta manera

Route::get('/', PostController::class, 'index')->name('index')

se me hace a mi mas corto

Para definir relaciones en la migración tambien pueden usar esta forma que ocupa una sola línea:

$table->foreignId('user_id')->constrained();

Eso reemplaza a:

    $table->unsignedBigInteger('user_id');
 
    $table->foreign('user_id')->references('id')->on('users');

Prefiero trabajar así

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{

    public function index(){
        $post =Post::latest()->paginate();
        return view('index', compact('post'));
    }
}

👋Hola a todos, les comparto una forma para revisar si su conexión con la base de datos fue exitosa usando Laravel tinker.

Primero debemos abrir nuestra consola de visual studio code e iniciamos tecleando el comando:

php artisan tinker

El siguiente paso es acceder a la instancia PDO con el siguiente comando, el cual nos devolver un objeto de PDO con la información de la conexión si todo fue exitoso, de lo contrario nos regresará un error.

BD::connection()->getPdo();

Ejemplo de éxito de conexión.

Ejemplo de un error de conexión con la base de datos

Una vez conozcas el estado de tu conexión puede simplemente despedirte de Laravel Tinker tecleando el comando:

exit

Si deseas consultar más información al respecto puedes revisar la documentación de Laravel Conexiones a bases de datos o sobre Tinker la consola interactiva 😊.

Si te fue de utilidad este información déjamelo saber en los comentarios, y si gustas agregar o aportar un dato extra seria genial. 🤗 Saludos a todos.

existe algo para crear diferentes ambientes de laravel? algo asi como conda?

Alguien sabe porque no me esta funcionando lo de los seeder tengo todo igual a la clase me da este error: BadMethodCallException Call to undefined method App\User::factory() at C:\laragon\www\api\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php:50 46| \* @throws \BadMethodCallException 47| \*/ 48| protected static function throwBadMethodCallException($method) 49| { \> 50| throw new BadMethodCallException(sprintf( 51| 'Call to undefined method %s::%s()', static::class, $method 52| )); 53| } 54| } • Bad Method Call: Did you mean App\User::toArray() ? 1 C:\laragon\www\api\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php:36 Illuminate\Database\Eloquent\Model::throwBadMethodCallException("factory") 2 C:\laragon\www\api\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1736 Illuminate\Database\Eloquent\Model::forwardCallTo(Object(Illuminate\Database\Eloquent\Builder), "factory")

Para cambiar de MyISAM a InnoDB en Laravel, puedes seguir los siguientes pasos:

Abre el archivo config/database.php.
Busca la línea ‘engine’ => null, y cámbiala por ‘engine’ => ‘InnoDB’

php artisan migrate —seed

al ejecutar el comando php artisan migrate —seed si muestra essores como por ejemplo:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter table users add unique users_email_unique(email))

Lo que debes hacer es lo siguiente Vamos a la ubicacion: app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

public function boot()
{
//
Schema::defaultStringLength(191);

}

Para abrir el editor en la ubicación de la terminal pueden usar:

code ./ -r

Espero a alguien le sirva…

web

En el archivo PostFactory.php pueden definir el user_id con un dato aleatorio del modelo users en lugar de hacer rand(1,10).

- 'user_id' => rand(1,10),
+ 'user_id' => \App\Models\User::inRandomOrder()->first()->id,

En vez de utilizar unsignedBigInteger, yo uso directamente foreignId. Esto te ahorra ese primer paso y creas tu llave foranea de una vez.

Para los que tienen dificultades al acceder a la conexión de BD local, yo lo pude realizar correctamente usando XAMPP

Utilizar un IDE como PHPStorm permite recibir ayuda sobre los métodos posibles a utilizar en los diferentes contextos, por ejemplo cuando llamamos a Faker. Así será más sencillo conocer los métodos disponibles y no usar únicamente los que tiene el docente.

yo hubiera utilizado $ php artisan make:controller PostController -rmf para que me escribiera todos los metodos la API para el controlador de posts.

me quede en migration

could not find driver (SQL: select * from information_schema.tables where table_schema = api and table_name = migrations and table_type = ‘BASE TABLE’)