Especialização em Backend com PHP & Laravel • Demonstrações Práticas Compiláveis


💻 Exemplo 1 — Fluxo Completo de Login com Sanctum

<?php
// app/Http/Controllers/Api/AuthController.php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;

class AuthController extends Controller
{
    public function login(Request $request)
    {
        $credenciais = $request->validate([
            'email'    => 'required|email',
            'password' => 'required|string',
        ]);

        $user = User::where('email', $credenciais['email'])->first();

        if (!$user || !Hash::check($credenciais['password'], $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['Credenciais inválidas.'],
            ]);
        }

        $token = $user->createToken('api-token', ['produtos:read', 'produtos:write'])->plainTextToken;

        return response()->json([
            'token'      => $token,
            'token_type' => 'Bearer',
            'user'       => $user->only('id', 'name', 'email'),
        ]);
    }

    public function logout(Request $request)
    {
        $request->user()->currentAccessToken()->delete();
        return response()->json(['mensagem' => 'Sessão encerrada.']);
    }

    public function logoutTodosDispositivos(Request $request)
    {
        $request->user()->tokens()->delete();
        return response()->json(['mensagem' => 'Todos os acessos foram revogados.']);
    }
}

💻 Exemplo 2 — Rotas Protegidas e Verificação de Abilities

<?php
// routes/api.php
use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\ProdutoController;
use Illuminate\Support\Facades\Route;

Route::post('/login', [AuthController::class, 'login']);

Route::middleware('auth:sanctum')->group(function () {
    Route::get('/user', fn (Request $request) => $request->user());
    Route::post('/logout', [AuthController::class, 'logout']);
    Route::post('/logout-all', [AuthController::class, 'logoutTodosDispositivos']);
    Route::apiResource('produtos', ProdutoController::class);
});
<?php
// app/Http/Controllers/Api/ProdutoController.php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ProdutoController extends Controller
{
    public function store(Request $request)
    {
        if (!$request->user()->tokenCan('produtos:write')) {
            return response()->json(['erro' => 'Token sem permissão de escrita'], 403);
        }

        $produto = $request->user()->produtos()->create($request->validate([
            'nome'  => 'required|string|max:255',
            'preco' => 'required|numeric|min:0',
        ]));

        return response()->json($produto, 201);
    }
}

💻 Exemplo 3 — Configuração de Expiração de Token

<?php
// config/sanctum.php (trecho relevante)
return [
    'expiration' => 60 * 24 * 7, // tokens expiram em 7 dias (minutos)

    'guard' => ['web'],

    'middleware' => [
        'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
        'encrypt_cookies'   => App\Http\Middleware\EncryptCookies::class,
    ],
];