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/
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