PHP code example of rbaezc / hexagenphp-framework

1. Go to this page and download the library: Download rbaezc/hexagenphp-framework library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

rbaezc / hexagenphp-framework example snippets


Route::get('/vuelos', [VuelosController::class, 'index'])->name('vuelos.index');

Route::group(['prefix' => '/api', 'middleware' => ['auth:jwt']], function () {
    Route::resource('/vuelos', VuelosController::class);
});

// Consultas
$vuelos = Vuelo::all();
$vuelo  = Vuelo::find(1);
$vuelo  = Vuelo::findOrFail(1);

// QueryBuilder
Vuelo::query()
    ->select(['id', 'origen', 'destino', 'precio'])
    ->where('precio', '<', 500)
    ->orWhere('clase', 'business')
    ->whereIn('aerolinea_id', [1, 2, 3])
    ->orderBy('precio', 'ASC')
    ->paginate(20);

// Creación / actualización
$vuelo = Vuelo::create(['origen' => 'MEX', 'destino' => 'MAD', 'precio' => 350]);
$vuelo->update(['precio' => 299]);
Vuelo::updateOrCreate(['origen' => 'MEX', 'destino' => 'MAD'], ['precio' => 299]);

// Eliminación
$vuelo->delete();

// Agregados
$total    = Vuelo::query()->count();
$promedio = Vuelo::query()->where('clase', 'economy')->avg('precio');
$existe   = Vuelo::query()->where('destino', 'MAD')->exists();

class Aerolinea extends Model
{
    public function vuelos(): HasMany      { return $this->hasMany(Vuelo::class, 'aerolinea_id'); }
    public function pais(): BelongsTo     { return $this->belongsTo(Pais::class); }
    public function hub(): HasOne         { return $this->hasOne(Aeropuerto::class); }
}

// Eager loading en exactamente 2 queries (sin N+1)
$aerolineas = Aerolinea::query()->with('vuelos', 'pais')->get();

// Eager loading con constraints
$aerolineas = Aerolinea::query()->with([
    'vuelos' => fn($q) => $q->where('clase', 'business')->orderBy('precio')
])->get();

class Vuelo extends Model
{
    use HasTimestamps;   // created_at / updated_at automáticos
    use SoftDeletes;     // deleted_at — no borra físicamente
    use HasCasts;        // cast automático de tipos
    use HasScopes;       // scopes locales y globales
    use HasObservers;    // hooks created/updated/deleted
    use HasFactory;      // Vuelo::factory()->create()

    protected static array $fillable = ['origen', 'destino', 'precio', 'clase'];
    protected static array $casts    = ['precio' => 'float', 'activo' => 'bool'];
}

// database/migrations/2024_01_01_create_vuelos_table.php
return new class extends Migration {
    public function up(\PDO $pdo): void {
        $pdo->exec("CREATE TABLE vuelos (
            id        INTEGER PRIMARY KEY AUTOINCREMENT,
            origen    VARCHAR(3) NOT NULL,
            destino   VARCHAR(3) NOT NULL,
            precio    DECIMAL(10,2),
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )");
    }
    public function down(\PDO $pdo): void {
        $pdo->exec("DROP TABLE IF EXISTS vuelos");
    }
};

// Session guard
auth()->attempt(['email' => $email, 'password' => $password]);
auth()->user();
auth()->logout();

// JWT guard
auth('jwt')->attempt($credentials);
$token = auth('jwt')->token();

// Gate / Policies
Gate::define('editar-vuelo', fn($user, $vuelo) => $user->id === $vuelo->user_id);

if (Gate::allows('editar-vuelo', $vuelo)) { /* ... */ }
// o en controlador:
$this->authorize('editar-vuelo', $vuelo);

class CrearVueloRequest extends FormRequest
{
    public function rules(): array {
        return [
            'origen'  => '    'clase'   => 'ic function messages(): array {
        return ['origen.

// app/Mail/BienvenidaMail.php
class BienvenidaMail extends Mailable
{
    public function build(): static {
        return $this->subject('Bienvenido')
                    ->view('emails.bienvenida')
                    ->with(['usuario' => $this->usuario]);
    }
}

Mail::to('[email protected]')->send(new BienvenidaMail($usuario));

// Definir un job
class ProcesarReservaJob extends Job
{
    public function handle(): void {
        // lógica del job
    }
}

// Despachar
dispatch(new ProcesarReservaJob($reserva));
dispatch(new ProcesarReservaJob($reserva))->onQueue('reservas');

// Worker
php hexaphp queue:work
php hexaphp queue:work --queue=reservas
php hexaphp queue:failed

Storage::put('vuelos/foto.jpg', $contenido);
Storage::get('vuelos/foto.jpg');
Storage::delete('vuelos/foto.jpg');
Storage::url('vuelos/foto.jpg');
Storage::exists('vuelos/foto.jpg');
Storage::disk('s3')->put('backup.zip', $contenido);

cache()->set('vuelos_populares', $vuelos, ttl: 3600);
cache()->get('vuelos_populares');
cache()->remember('vuelos_mex', 600, fn() => Vuelo::query()->where('origen', 'MEX')->get());
cache()->delete('vuelos_populares');

// Definir
class VueloReservado extends Event
{
    public function __construct(public readonly Vuelo $vuelo) {}
}

// Listener
class EnviarConfirmacion implements ListenerInterface
{
    public function handle(object $event): void {
        Mail::to($event->vuelo->email)->send(new ConfirmacionMail($event->vuelo));
    }
}

// Disparar
event(new VueloReservado($vuelo));

class ReservaConfirmada extends Notification
{
    public function via(): array    { return ['mail', 'database']; }
    public function toMail(): array { return ['subject' => 'Reserva confirmada', ...]; }
}

$usuario->notify(new ReservaConfirmada($reserva));
// o: notify($usuario, new ReservaConfirmada($reserva));

class VueloActualizado extends Event implements ShouldBroadcast
{
    public function broadcastOn(): string  { return 'vuelos'; }
    public function broadcastAs(): string  { return 'actualizado'; }
}

// Cliente JavaScript
const source = new EventSource('/broadcast/vuelos');
source.addEventListener('actualizado', e => console.log(JSON.parse(e.data)));

// lang/es/vuelos.php
return ['bienvenida' => 'Bienvenido, :nombre'];

__('vuelos.bienvenida', ['nombre' => 'Raúl']);   // "Bienvenido, Raúl"
trans_choice('vuelos.asientos', $n);               // pluralización con pipes

// View composers — datos automáticos en vistas
View::composer('layouts/*', function (ViewData $data) {
    $data->set('monedas', Moneda::all());
});

// Datos compartidos globalmente
View::share('app_name', config('app.name'));

$response = Http::withToken($token)
    ->retry(3, 100)
    ->post('https://api.aerolinea.com/reservas', ['vuelo_id' => 1]);

$response->json();
$response->status();
$response->successful();

// src/Core/Console/Scheduler.php
$schedule->command('vuelos:sync')->hourly();
$schedule->command('reportes:generar')->dailyAt('06:00');
$schedule->call(fn() => Cache::clear())->everyFiveMinutes();

class VuelosTest extends TestCase
{
    public function test_crear_vuelo(): void
    {
        $vuelo = Vuelo::factory()->create(['origen' => 'MEX', 'destino' => 'MAD']);

        $response = $this->post('/api/vuelos', ['origen' => 'MEX', 'destino' => 'MAD', 'precio' => 350]);

        $response->assertStatus(201)
                 ->assertJsonPath('data.origen', 'MEX');
    }

    public function test_requiere_autenticacion(): void
    {
        $this->get('/api/mis-reservas')->assertStatus(401);
    }
}

// database/factories/VueloFactory.php
class VueloFactory extends ModelFactory
{
    protected string $model = Vuelo::class;

    public function definition(): array {
        return [
            'origen'  => $this->faker->lexify('???'),
            'destino' => $this->faker->lexify('???'),
            'precio'  => $this->faker->randomFloat(2, 50, 1500),
            'clase'   => $this->faker->randomElement(['economy', 'business']),
        ];
    }
}

// Uso
Vuelo::factory()->make();
Vuelo::factory()->count(10)->create();
Vuelo::factory()->state(['clase' => 'business'])->create();

class ContadorVuelos extends LiveComponent
{
    public int $clicks = 0;

    public function incrementar(): void { $this->clicks++; }

    public function render(): string   { return $this->renderView('@Vuelos/contador.twig'); }
}

// public/index.php
$kernel = new HexaGen\Core\Kernel();
$kernel->boot();

if (function_exists('frankenphp_handle_request')) {
    for ($i = 0; frankenphp_handle_request() && $i < 1000; ++$i) {
        $request  = Request::createFromGlobals();
        $response = $kernel->handle($request);
        $response->send();
        $kernel->terminate($request, $response); // limpia auth + request por request
        gc_collect_cycles();
    }
}
bash
composer create-project rbaezc/hexagenphp-framework mi-app
cd mi-app
cp .env.example .env
php hexaphp migrate
php hexaphp server:start
bash
php hexaphp migrate              # Corre migraciones pendientes
php hexaphp migrate:rollback     # Revierte el último batch
php hexaphp migrate:rollback --step=3
php hexaphp migrate:fresh        # Drop all + re-run
php hexaphp migrate:status       # Muestra estado (Ran / Pending)
bash
php hexaphp schedule:list          # Ver tareas programadas
php hexaphp schedule:work          # Daemon con graceful shutdown (SIGTERM)
bash
php hexaphp openapi:generate       # Genera openapi.json desde tus rutas