PHP code example of hendabastian / laracrud-apigen

1. Go to this page and download the library: Download hendabastian/laracrud-apigen 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/ */

    

hendabastian / laracrud-apigen example snippets


return [
    'model_namespace'       => 'App\\Models',
    'controller_namespace'  => 'App\\Http\\Controllers\\Api',
    'request_namespace'     => 'App\\Http\\Requests\\Api',
    'resource_namespace'    => 'App\\Http\\Resources\\Api',
    'repository_namespace'  => 'App\\Repositories',
    'dto_namespace'         => 'App\\DTO',
    'route_file'            => 'routes/api.php',
    'service_provider'      => 'app/Providers/AppServiceProvider.php',
    'excluded_columns'      => ['id', 'created_at', 'updated_at', ...],
    'use_query_builder'     => true,
    'use_json_api_paginate' => true,
    'use_spatie_data'       => true,
];

// app/Repositories/CompanyRepository.php (generated)


namespace App\Repositories;

use App\Models\Company;
use App\Repositories\Contracts\CompanyRepositoryInterface;
use Spatie\QueryBuilder\QueryBuilder;

class CompanyRepository extends BaseRepository implements CompanyRepositoryInterface
{
    public function __construct(Company $model)
    {
        parent::__construct($model);
    }

    public function list(): mixed
    {
        return QueryBuilder::for($this->model->query())
            ->allowedFilters(['name', 'email', ...])
            ->allowedSorts(['name', 'email', ..., 'created_at', 'updated_at'])
            ->allowedIncludes([...])
            ->jsonPaginate();
    }
}

public function index(): AnonymousResourceCollection
{
    $companies = $this->repository->list();

    return CompanyResource::collection($companies);
}

// app/Repositories/OrderRepository.php
public function list(): mixed
{
    return QueryBuilder::for($this->model->query())
        ->allowedFilters([
            AllowedFilter::exact('status'),
            AllowedFilter::scope('date_range'),
        ])
        ->allowedSorts(['total', 'created_at'])
        ->allowedIncludes(['customer', 'items'])
        ->where('archived', false) // always exclude archived
        ->jsonPaginate();
}

// app/Repositories/Contracts/OrderRepositoryInterface.php


namespace App\Repositories\Contracts;

use Illuminate\Database\Eloquent\Collection;

interface OrderRepositoryInterface extends BaseRepositoryInterface
{
    public function list(): mixed;

    public function findByStatus(string $status): Collection;

    public function cancelExpiredOrders(): int;
}

// app/Repositories/OrderRepository.php


namespace App\Repositories;

use App\Models\Order;
use App\Repositories\Contracts\OrderRepositoryInterface;
use Illuminate\Database\Eloquent\Collection;

class OrderRepository extends BaseRepository implements OrderRepositoryInterface
{
    public function __construct(Order $model)
    {
        parent::__construct($model);
    }

    public function findByStatus(string $status): Collection
    {
        return $this->model->where('status', $status)->get();
    }

    public function cancelExpiredOrders(): int
    {
        return $this->model
            ->where('status', 'pending')
            ->where('expires_at', '<', now())
            ->update(['status' => 'cancelled']);
    }
}

// app/Repositories/UserRepository.php


namespace App\Repositories;

use App\Models\User;
use App\Repositories\Contracts\UserRepositoryInterface;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Hash;

class UserRepository extends BaseRepository implements UserRepositoryInterface
{
    public function __construct(User $model)
    {
        parent::__construct($model);
    }

    public function create(array $data): Model
    {
        if (isset($data['password'])) {
            $data['password'] = Hash::make($data['password']);
        }

        return parent::create($data);
    }

    public function update(int $id, array $data): Model
    {
        if (isset($data['password'])) {
            $data['password'] = Hash::make($data['password']);
        }

        return parent::update($id, $data);
    }
}

// app/Http/Controllers/Api/OrderController.php

// Add this method to the generated controller:
public function cancel(Order $order): JsonResponse
{
    if ($order->status === 'shipped') {
        return response()->json(['message' => 'Cannot cancel a shipped order.'], 422);
    }

    $this->repository->update($order->id, ['status' => 'cancelled']);

    return response()->json(['message' => 'Order cancelled successfully.']);
}

// routes/api.php
Route::patch('orders/{order}/cancel', [\App\Http\Controllers\Api\OrderController::class, 'cancel']);

// app/Http/Requests/Api/Order/OrderCreateRequest.php
public function rules(): array
{
    return [
        'customer_id' => ['irmed,shipped'],
        'notes'       => ['nullable', 'string', 'max:1000'],
        'items'       => ['

// app/Http/Resources/Api/OrderResource.php
public function toArray(Request $request): array
{
    return [
        'id'         => $this->id,
        'customer_id'=> $this->customer_id,
        'total'      => number_format($this->total, 2),
        'status'     => $this->status,
        'is_editable'=> in_array($this->status, ['pending', 'confirmed']),
        'customer'   => new CustomerResource($this->whenLoaded('customer')),
        'items'      => OrderItemResource::collection($this->whenLoaded('items')),
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
    ];
}

// config/json-api-paginate.php (published via spatie/laravel-json-api-paginate)
return [
    'max_results'          => 30,
    'default_size'         => 30,
    'number_parameter'     => 'number',
    'size_parameter'       => 'size',
    'cursor_parameter'     => 'cursor',
    'pagination_parameter' => 'page',
    'use_cursor_pagination'=> false,
];

->withRouting(
    web: __DIR__.'/../routes/web.php',
    api: __DIR__.'/../routes/api.php',
    commands: __DIR__.'/../routes/console.php',
)
bash
php artisan generate:crud-api {ModelName}
bash
# Generate CRUD for User model
php artisan generate:crud-api User

# Generate CRUD for a multi-word model
php artisan generate:crud-api JobApplication

# Overwrite existing files
php artisan generate:crud-api User --force

# Skip repository pattern
php artisan generate:crud-api User --skip-repository

# Skip DTO generation
php artisan generate:crud-api User --skip-dto

# Skip route registration
php artisan generate:crud-api User --skip-routes
bash
php artisan vendor:publish --tag=crud-generator-config