PHP code example of elarion / elarionstack

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

    

elarion / elarionstack example snippets


// PSR-11 compliant with automatic dependency resolution
$container->bind(UserRepository::class, DatabaseUserRepository::class);
$container->singleton(Logger::class, FileLogger::class);

// Auto-wiring with type hints
$service = $container->make(UserService::class);

class DatabaseServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->container->singleton(ConnectionManager::class, function($c) {
            return new ConnectionManager($c->make(Config::class));
        });
    }

    public function boot(): void
    {
        // Bootstrap logic after all services registered
    }
}

use Elarion\Routing\Router;

// Simple routing
$router->get('/users', [UserController::class, 'index']);
$router->post('/users', [UserController::class, 'store']);

// Route parameters with constraints
$router->get('/users/{id}', [UserController::class, 'show'])
    ->where('id', '[0-9]+')
    ->name('users.show');

// Route groups
$router->group(['prefix' => '/api/v1', 'middleware' => ['auth']], function($router) {
    $router->get('/profile', [ProfileController::class, 'show']);
    $router->resource('/posts', PostController::class);
});

use Elarion\Http\Message\{Response, ServerRequest};

// Fluent response creation
return Response::json(['message' => 'Success'], 201)
    ->withHeader('X-Custom', 'Value');

return Response::html('<h1>Hello</h1>');
return Response::redirect('/login');
return Response::noContent();

// Rich request interface
$body = $request->getParsedBody();
$query = $request->getQueryParams();
$header = $request->getHeaderLine('Authorization');

// FIFO middleware execution
$pipeline = new Pipeline();
$response = $pipeline
    ->pipe(new CorsMiddleware())
    ->pipe(new AuthMiddleware())
    ->pipe(new RateLimitMiddleware())
    ->process($request, $handler);

// Short-circuit support
class AuthMiddleware implements MiddlewareInterface
{
    public function process(Request $request, Handler $handler): Response
    {
        if (!$this->isAuthenticated($request)) {
            return Response::json(['error' => 'Unauthorized'], 401);
        }
        return $handler->handle($request);
    }
}

use Elarion\Database\ConnectionManager;

// Multiple named connections
$manager = new ConnectionManager($config);
$mysql = $manager->connection('mysql');
$postgres = $manager->connection('postgres');

// Lazy-loading with automatic reconnection

use Elarion\Database\DB;

// Fluent interface
$users = DB::table('users')
    ->select('id', 'name', 'email')
    ->where('status', '=', 'active')
    ->where('age', '>', 18)
    ->orderBy('created_at', 'desc')
    ->limit(10)
    ->get();

// Complex queries
$results = DB::table('orders')
    ->join('users', 'orders.user_id', '=', 'users.id')
    ->whereIn('status', ['pending', 'processing'])
    ->orWhere(function($query) {
        $query->where('priority', 'high')
              ->where('urgent', true);
    })
    ->groupBy('user_id')
    ->having('total', '>', 1000)
    ->get();

// Aggregates
$count = DB::table('users')->count();
$avg = DB::table('orders')->avg('total');
$sum = DB::table('sales')->sum('amount');

use Elarion\Database\Model;

class User extends Model
{
    protected string $table = 'users';
    protected array $fillable = ['name', 'email', 'age'];
    protected bool $timestamps = true;
}

// CRUD operations
$user = User::create([
    'name' => 'John Doe',
    'email' => '[email protected]',
]);

$user = User::find(1);
$users = User::where('active', true)->get();

$user->update(['name' => 'Jane Doe']);
$user->delete();

// Mass updates
User::where('inactive', true)->update(['status' => 'archived']);

use Elarion\Http\Resources\JsonResource;

class UserResource extends JsonResource
{
    public function toArray(ServerRequestInterface $request): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,

            // Conditional attributes
            'role' => $this->when($this->isAdmin(), $this->role),
            'permissions' => $this->when($this->isAdmin(), $this->permissions),

            // Nested resources
            'posts' => PostResource::collection($this->posts),

            // Merge conditional arrays
            'metadata' => $this->mergeWhen(isset($this->metadata), [
                'last_login' => $this->last_login,
                'created_at' => $this->created_at,
            ]),
        ];
    }
}

// Usage in controllers
return UserResource::make($user)->toResponse($request);
return UserResource::collection($users)->toResponse($request);

use Elarion\Http\Resources\JsonApi\JsonApiResource;

class UserJsonApiResource extends JsonApiResource
{
    public function type(): string
    {
        return 'users';
    }

    public function attributes(ServerRequestInterface $request): array
    {
        return [
            'name' => $this->resource->name,
            'email' => $this->resource->email,
        ];
    }

    public function relationships(ServerRequestInterface $request): array
    {
        return [
            'posts' => $this->relationship(
                'posts',
                PostJsonApiResource::collection($this->resource->posts)
            ),
        ];
    }
}

// Automatic JSON:API formatting with compound documents
return UserJsonApiResource::make($user)->toResponse($request);

use Elarion\Validation\Validator;

$validator = new Validator($request->getParsedBody(), [
    'name' => '' => 'array',
    'is_active' => 'boolean',

    // Nested validation with dot notation
    'address.street' => 'n Response::json([
        'errors' => $validator->errors()
    ], 422);
}

$data = $validator->validated();

// Closure-based
$validator->addRule('username', function($value) {
    return preg_match('/^[a-zA-Z0-9_]+$/', $value);
}, 'Username must be alphanumeric');

// Class-based
class UniqueEmailRule implements RuleInterface
{
    public function passes(string $field, mixed $value, array $data): bool
    {
        return !User::where('email', $value)->exists();
    }

    public function message(string $field): string
    {
        return "The {$field} is already taken.";
    }
}

use Elarion\Support\Collection;

$collection = collect([1, 2, 3, 4, 5]);

// Transformations
$mapped = $collection->map(fn($n) => $n * 2);
$filtered = $collection->filter(fn($n) => $n > 2);
$reduced = $collection->reduce(fn($carry, $n) => $carry + $n, 0);

// Utilities
$sum = $collection->sum();
$avg = $collection->avg();
$first = $collection->first();
$last = $collection->last();

// Sorting & grouping
$sorted = $collection->sort();
$sortedBy = $collection->sortBy('name');
$grouped = $collection->groupBy('category');

// Working with nested data
$users = collect([
    ['name' => 'John', 'email' => '[email protected]'],
    ['name' => 'Jane', 'email' => '[email protected]'],
]);

$emails = $users->pluck('email');
$names = $users->pluck('name')->implode(', ');

// Method chaining
$result = collect($data)
    ->filter(fn($item) => $item['active'])
    ->map(fn($item) => $item['value'])
    ->sum();

use Elarion\OpenAPI\Attributes\{Get, Post, PathParameter, QueryParameter, RequestBody};

class UserController
{
    #[Get(
        path: '/api/users',
        summary: 'List all users',
        description: 'Returns paginated list of users',
        tags: ['Users']
    )]
    #[QueryParameter('page', 'integer', 'Page number')]
    #[QueryParameter('limit', 'integer', 'Items per page')]
    public function index(ServerRequestInterface $request): Response
    {
        // Automatically generates OpenAPI documentation
    }

    #[Post(
        path: '/api/users',
        summary: 'Create new user',
        tags: ['Users']
    )]
    #[RequestBody('User data', 

// Environment variables with type conversion
$debug = env('APP_DEBUG', false); // bool
$port = env('APP_PORT', 8000); // int

// Configuration with dot notation
$dbHost = config('database.connections.mysql.host');

// Debugging
dd($data); // dump and die
dump($data); // dump without stopping

// Response helpers
return response()->json(['status' => 'ok']);
return response()->redirect('/home');

// Collections
$collection = collect([1, 2, 3]);

// Value utilities
$value = value(fn() => expensiveComputation());
$result = tap($user, fn($u) => $u->notify());

// config/database.php
return [
    'default' => env('DB_CONNECTION', 'mysql'),
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'database' => env('DB_DATABASE', 'app'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
        ],
    ],
];

// Access anywhere
$connection = config('database.default');
$host = config('database.connections.mysql.host');

use Elarion\Routing\Router;
use Elarion\Http\Message\Response;

$router->get('/api/status', function($request) {
    return Response::json([
        'status' => 'running',
        'framework' => 'ElarionStack',
        'version' => '1.0.0'
    ]);
});

$router->group(['prefix' => '/api/posts'], function($router) {
    $router->get('/', [PostController::class, 'index']);      // GET /api/posts
    $router->post('/', [PostController::class, 'store']);     // POST /api/posts
    $router->get('/{id}', [PostController::class, 'show']);   // GET /api/posts/1
    $router->put('/{id}', [PostController::class, 'update']); // PUT /api/posts/1
    $router->delete('/{id}', [PostController::class, 'destroy']); // DELETE /api/posts/1
});

namespace App\Http\Controllers;

use Elarion\Http\Message\Response;
use Elarion\Validation\Validator;
use Psr\Http\Message\ServerRequestInterface;

class PostController
{
    private array $posts = []; // In-memory storage for demo

    public function index(ServerRequestInterface $request): Response
    {
        return Response::json([
            'data' => $this->posts,
            'total' => count($this->posts)
        ]);
    }

    public function store(ServerRequestInterface $request): Response
    {
        // Validate input
        $validator = new Validator($request->getParsedBody(), [
            'title' => ' ];

        $this->posts[] = $post;

        return Response::json($post, 201);
    }

    public function show(int $id): Response
    {
        $post = $this->findPost($id);

        if (!$post) {
            return Response::json(['error' => 'Post not found'], 404);
        }

        return Response::json($post);
    }

    public function update(int $id, ServerRequestInterface $request): Response
    {
        $post = $this->findPost($id);

        if (!$post) {
            return Response::json(['error' => 'Post not found'], 404);
        }

        $validator = new Validator($request->getParsedBody(), [
            'title' => 'string|min:3|max:255',
            'content' => 'string|min:10',
        ]);

        if (!$validator->validate()) {
            return Response::json([
                'error' => 'Validation failed',
                'details' => $validator->errors()
            ], 422);
        }

        $updated = array_merge($post, $validator->validated());
        $updated['updated_at'] = date('Y-m-d H:i:s');

        return Response::json($updated);
    }

    public function destroy(int $id): Response
    {
        $post = $this->findPost($id);

        if (!$post) {
            return Response::json(['error' => 'Post not found'], 404);
        }

        // Delete post (demo)
        return Response::noContent();
    }

    private function findPost(int $id): ?array
    {
        foreach ($this->posts as $post) {
            if ($post['id'] === $id) {
                return $post;
            }
        }
        return null;
    }
}

// routes/api.php
use Elarion\Routing\Router;
use Elarion\Http\Message\Response;

$router->get('/hello', function($request) {
    return Response::json([
        'message' => 'Hello, ElarionStack!',
        'version' => '1.0.0',
        'timestamp' => date('c')
    ]);
});

$router->get('/users/{id}', [UserController::class, 'show'])
    ->where('id', '[0-9]+')
    ->name('users.show');

// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;

use Elarion\Http\Message\Response;
use Elarion\Validation\Validator;
use Psr\Http\Message\ServerRequestInterface;

class UserController
{
    public function index(ServerRequestInterface $request): Response
    {
        $users = User::all();
        return UserResource::collection($users)->toResponse($request);
    }

    public function store(ServerRequestInterface $request): Response
    {
        $validator = new Validator($request->getParsedBody(), [
            'name' => '
}

// app/Models/User.php
namespace App\Models;

use Elarion\Database\Model;

class User extends Model
{
    protected string $table = 'users';

    protected array $fillable = [
        'name',
        'email',
        'password',
    ];

    protected bool $timestamps = true;
}

// app/Http/Resources/UserResource.php
namespace App\Http\Resources;

use Elarion\Http\Resources\JsonResource;

class UserResource extends JsonResource
{
    public function toArray(ServerRequestInterface $request): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
        ];
    }
}

// routes/api.php
$router->group(['prefix' => '/api/v1'], function($router) {

    // Public routes
    $router->post('/register', [AuthController::class, 'register']);
    $router->post('/login', [AuthController::class, 'login']);

    // Protected routes
    $router->group(['middleware' => ['auth:api']], function($router) {

        // User profile
        $router->get('/profile', [ProfileController::class, 'show']);
        $router->put('/profile', [ProfileController::class, 'update']);

        // Posts resource
        $router->get('/posts', [PostController::class, 'index']);
        $router->post('/posts', [PostController::class, 'store']);
        $router->get('/posts/{id}', [PostController::class, 'show']);
        $router->put('/posts/{id}', [PostController::class, 'update']);
        $router->delete('/posts/{id}', [PostController::class, 'destroy']);

        // Comments
        $router->post('/posts/{postId}/comments', [CommentController::class, 'store']);
        $router->get('/posts/{postId}/comments', [CommentController::class, 'index']);
    });
});

// Full JSON:API resource with relationships
class PostJsonApiResource extends JsonApiResource
{
    public function type(): string
    {
        return 'posts';
    }

    public function attributes(ServerRequestInterface $request): array
    {
        return [
            'title' => $this->resource->title,
            'content' => $this->resource->content,
            'published_at' => $this->resource->published_at,
        ];
    }

    public function relationships(ServerRequestInterface $request): array
    {
        return [
            'author' => $this->relationship(
                'users',
                UserJsonApiResource::make($this->resource->author),
                links: [
                    'self' => "/api/posts/{$this->id()}/relationships/author",
                    'related' => "/api/posts/{$this->id()}/author",
                ]
            ),
            'comments' => $this->relationship(
                'comments',
                CommentJsonApiResource::collection($this->resource->comments),
                meta: ['count' => count($this->resource->comments)]
            ),
        ];
    }

    public function links(ServerRequestInterface $request): array
    {
        return [
            'self' => "/api/posts/{$this->id()}",
        ];
    }
}

// Controller
public function show(int $id, ServerRequestInterface $request): Response
{
    $post = Post::with(['author', 'comments'])->find($id);

    if (!$post) {
        return JsonApiErrorResponse::notFound('Post not found');
    }

    return PostJsonApiResource::make($post)
        ->toResponse($request);
}

// Advanced queries
$orders = DB::table('orders')
    ->select('orders.*', 'users.name as user_name')
    ->join('users', 'orders.user_id', '=', 'users.id')
    ->leftJoin('shipping', 'orders.id', '=', 'shipping.order_id')
    ->where('orders.status', '=', 'pending')
    ->where(function($query) {
        $query->where('orders.priority', 'high')
              ->orWhere('orders.amount', '>', 1000);
    })
    ->whereIn('orders.payment_method', ['credit_card', 'paypal'])
    ->whereNotNull('shipping.tracking_number')
    ->whereBetween('orders.created_at', ['2024-01-01', '2024-12-31'])
    ->groupBy('orders.user_id')
    ->having('total_amount', '>', 5000)
    ->orderBy('orders.created_at', 'desc')
    ->limit(50)
    ->offset(0)
    ->get();

// Aggregates
$stats = [
    'total_orders' => DB::table('orders')->count(),
    'total_revenue' => DB::table('orders')->sum('amount'),
    'avg_order_value' => DB::table('orders')->avg('amount'),
    'max_order' => DB::table('orders')->max('amount'),
    'min_order' => DB::table('orders')->min('amount'),
];

// Raw queries with bindings
$users = DB::table('users')
    ->whereRaw('YEAR(created_at) = ?', [2024])
    ->get();