Creación de Proyecto en Laravel

Primero vamos a crear un proyecto usando Composer:

composer create-project laravel/laravel laravel-crud-api

otro modo de crearlo es usando el comando Laravel:

laravel new laravel-crud-restapi

cd .\laravel-crud-api\

code .

php artisan serve

Puedes visitar http://localhost:80000

php artisan install:api

ve a routes/api.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('/students', function () {
    return 'Students List';
});

CRUD sencillo

<?php

use Illuminate\Support\Facades\Route;

Route::get('/students', function () {
    return 'Students List';
});

Route::get('/students/{id}', function ($id) {
    return 'Student ' . $id;
});

Route::post('/students', function () {
    return 'Create Student';
});

Route::put('/students/{id}', function ($id) {
    return 'Update Student ' . $id;
});

Route::delete('/students/{id}', function ($id) {
    return 'Delete Student ' . $id;
});

Crea una tabla

para eso usamos una migracion:

php artisan make:migration create_student_table

vamos en la carpeta databaes/migrations/.php

   public function up(): void
    {
        Schema::create('student', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email');
            $table->string('phone');
            $table->string('language');
            $table->timestamps();
        });
    }

Luego para migrar:

php artisan migrate

Creando un modelo

php artisan make:model Student

Luego vamos en app/Models/Student.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    use HasFactory;

    protected $table = 'student';

    protected $fillable = [
        'name',
        'email',
        'phone',
        'language',
    ];
}

Alli lo que haremos es colocar el nombre de la tabla student que es el mismo que usamos en la migracion y los campos que pueden ser llenados al crearse

Creando controller

php artisan make:controller studentController

En mi caso lo colocare en una carpeta llamada Api

php artisan make:controller Api/StudentController

dentro de este archivo app/Http/Controllers/Api/StudentController.php

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;

class StudentController extends Controller
{
    public function index()
    {
        return 'Students List Controller';
    }
}

y en routes/api.php

<?php

use App\Http\Controllers\Api\StudentController;
use Illuminate\Support\Facades\Route;

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

Puedes visitar http://localhost:8000/api/students

Consultando base de datos

dentro de este archivo app/Http/Controllers/Api/StudentController.php

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Student;

class StudentController extends Controller
{
    public function index()
    {
        $students = Student::all();

        if ($students->isEmpty()) {
            $data = [
                'message' => 'No students found',
                'status' => 404,
            ];

            return response()->json($data, 404);
        }

        $data = [
            'students' => $students,
            'status' => 200,
        ];

        return response()->json($data, 200);
    }
}

POST Request

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Student;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;

class StudentController extends Controller
{

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|max:255',
            'email' => 'required|email|unique:student',
            'phone' => 'required|digits:10',
            'language' => 'required|in:English,Spanish,French',
        ]);

        if ($validator->fails()) {
            $data = [
                'message' => 'Validation error',
                'errors' => $validator->errors(),
                'status' => 400,
            ];

            return response()->json($data, 400);
        }

        $student = Student::create([
            'name' => $request->name,
            'email' => $request->email,
            'phone' => $request->phone,
            'language' => $request->language,
        ]);

        if (!$student) {
            $data = [
                'message' => 'Failed to create student',
                'status' => 500,
            ];

            return response()->json($data, 500);
        }

        $data = [
            'message' => 'Student created',
            'student' => $student,
            'status' => 201,
        ];

        return response()->json($data, 201);

    }
}

Puedes visitar POST http://localhost:8000/api/students

Route::post('/students', [StudentController::class, 'store']);

GET /students/:id

Para obtener un solo estudiante

   public function show($id)
    {
        $student = Student::find($id);

        if (!$student) {
            $data = [
                'message' => 'Student not found',
                'status' => 404,
            ];

            return response()->json($data, 404);
        }

        $data = [
            'student' => $student,
            'status' => 200,
        ];

        return response()->json($data, 200);
    }
Route::get('/students/{id}', [StudentController::class, 'show']);

Delete

  public function destroy($id)
    {
        $student = Student::find($id);

        if (!$student) {
            $data = [
                'message' => 'Student not found',
                'status' => 404,
            ];

            return response()->json($data, 404);
        }

        $student->delete();

        $data = [
            'message' => 'Student deleted',
            'status' => 200,
        ];

        return response()->json($data, 200);
    }
Route::delete('/students/{id}', [StudentController::class, 'destroy']);

Put

    public function update(Request $request, $id)
    {
        $student = Student::find($id);

        if (!$student) {
            $data = [
                'message' => 'Student not found',
                'status' => 404,
            ];

            return response()->json($data, 404);
        }

        $validator = Validator::make($request->all(), [
            'name' => 'required|max:255',
            'email' => 'required|email|unique:student,email,' . $id,
            'phone' => 'required|digits:10',
            'language' => 'required|in:English,Spanish,French',
        ]);

        if ($validator->fails()) {
            $data = [
                'message' => 'Validation error',
                'errors' => $validator->errors(),
                'status' => 400,
            ];

            return response()->json($data, 400);
        }

        $student->name = $request->name;
        $student->email = $request->email;
        $student->phone = $request->phone;
        $student->language = $request->language;

        $student->save();

        $data = [
            'message' => 'Student updated',
            'student' => $student,
            'status' => 200,
        ];

        return response()->json($data, 200);
    }
Route::put('/students/{id}', [StudentController::class, 'update']);

Patch

    public function updatePartial(Request $request, $id)
    {
        $student = Student::find($id);

        if (!$student) {
            $data = [
                'message' => 'Student not found',
                'status' => 404,
            ];

            return response()->json($data, 404);
        }

        $validator = Validator::make($request->all(), [
            'name' => 'max:255',
            'email' => 'email|unique:student,email,' . $id,
            'phone' => 'digits:10',
            'language' => 'in:English,Spanish,French',
        ]);

        if ($validator->fails()) {
            $data = [
                'message' => 'Validation error',
                'errors' => $validator->errors(),
                'status' => 400,
            ];

            return response()->json($data, 400);
        }

        if ($request->has('name')) {
            $student->name = $request->name;
        }

        if ($request->has('email')) {
            $student->email = $request->email;
        }

        if ($request->has('phone')) {
            $student->phone = $request->phone;
        }

        if ($request->has('language')) {
            $student->language = $request->language;
        }

        $student->save();

        $data = [
            'message' => 'Student updated',
            'student' => $student,
            'status' => 200,
        ];

        return response()->json($data, 200);
    }
Route::patch('/students/{id}', [StudentController::class, 'updatePartial']);

Actualizar a MySQL

  • activar Xampp (Apache y MySQL)
  • crea una base de datos de mysql llamada laraveltest1
  • colocar la siguiente configuracion en .env

DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laraveltest1 DB_USERNAME=root DB_PASSWORD=

php artisan migrate