PHP code example of andrewthecoder / arcmvc

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

    

andrewthecoder / arcmvc example snippets


use Arc\Config\EnvLoader;
EnvLoader::load(__DIR__ . '/../.env');

$router->get('/', [HomeController::class, 'index']);
$router->get('/users/{id}', [UserController::class, 'show']);
$router->post('/users', [UserController::class, 'store']);
$router->put('/users/{id}', [UserController::class, 'update']);
$router->delete('/users/{id}', [UserController::class, 'destroy']);

$router->group(['prefix' => 'admin', 'middleware' => [AuthMiddleware::class]], function ($router) {
    $router->get('/dashboard', [AdminController::class, 'index']);
});

use Arc\Support\Controller;
use Arc\Http\Request;
use Arc\Http\Response;

class UserController extends Controller
{
    public function show(Request $request, string $id): Response
    {
        $user = User::find($id);
        return $this->view('users.show', ['user' => $user]);
    }

    public function store(Request $request): Response
    {
        return $this->redirect('/users');
    }

    protected function back(): Response // Safe redirect, rejects external URLs
    {
        return parent::back();
    }
}

 $this->extend('main') 

<title><?= $this->yield('title', 'Arc') 

<h1><?= $this->e($userInput) 

<form method="POST" action="/users">
    <?= $this->csrfField() 

<?= $this->partial('shared._nav', ['label' => 'Home']) 

use Arc\Http\MiddlewareInterface;
use Arc\Http\Request;
use Arc\Http\Response;

final class SecurityHeadersMiddleware implements MiddlewareInterface
{
    public function handle(Request $request, callable $next): Response
    {
        $response = $next($request);

        return $response
            ->withHeader('X-Frame-Options', 'DENY')
            ->withHeader('X-Content-Type-Options', 'nosniff')
            ->withHeader('Referrer-Policy', 'no-referrer')
            ->withHeader('Permissions-Policy', 'camera=(), microphone=()');
    }
}

final class AuthMiddleware implements MiddlewareInterface
{
    public function handle(Request $request, callable $next): Response
    {
        $userId = $this->authenticate($request); // returns null or an ID
        $requestWithUser = $request->withAttribute('user_id', $userId);
        return $next($requestWithUser);
    }

    private function authenticate(Request $request): ?int { /* ... */ }
}

use Arc\Http\Middleware\SecurityMiddleware;
use Arc\Http\Middleware\CsrfMiddleware;
use Arc\Http\Middleware\RateLimitMiddleware;

$app->addMiddleware(SecurityMiddleware::class);
$app->addMiddleware(new CsrfMiddleware());
$app->addMiddleware(new RateLimitMiddleware(maxRequests: 60, windowSeconds: 60));

new SecurityMiddleware(
    csp: "default-src 'self'; script-src 'self' cdn.example.com",
    hsts: 'max-age=63072000; 

new RateLimitMiddleware(maxRequests: 100, windowSeconds: 60);

new RateLimitMiddleware(
    maxRequests: 5,
    windowSeconds: 60,
    trustedProxies: ['10.0.0.1'],
    keyResolver: fn ($request) => 'login:' . $request->ip(['10.0.0.1']),
);

use Arc\Database\QueryBuilder;

$builder = new QueryBuilder($connection, 'users');

// SELECT with WHERE, ORDER BY, LIMIT
$users = $builder->where('active', 1)
    ->orderBy('name')
    ->limit(10)
    ->get();

// Operators: =, !=, <>, <, >, <=, >=, LIKE, NOT LIKE
$builders = $builder->where('price', '>', 100)->get();

// NULL checks
$builder->whereNull('deleted_at');
$builder->whereNotNull('email');

// IN / NOT IN
$builder->whereIn('role', ['admin', 'editor']);
$builder->whereNotIn('status', ['banned', 'suspended']);

// First row only (returns null if not found)
$user = $builder->where('id', 1)->first();

// Aggregates
$builder->count();
$builder->exists();
$builder->sum('price');
$builder->avg('price');
$builder->min('price');
$builder->max('price');

// INSERT
$id = $builder->insert(['name' => 'Arc', 'email' => '[email protected]']);

// UPDATE with WHERE
$builder->where('id', 1)->update(['name' => 'Updated']);

// DELETE with WHERE
$builder->where('id', 1)->delete();

// Select specific columns
$builder->select(['name', 'email'])->get();

use Arc\Database\Model;

class User extends Model
{
    protected string $table = 'users';
    protected string $primaryKey = 'id';
    protected array $fillable = ['name', 'email'];
}

User::all(limit: 50, offset: 0);               // paginated retrieval
User::find($id);                                 // single record or null
User::findOrFail($id);                           // single record or throws
User::where('email', '[email protected]');        // conditional query
User::where('age', '>', 18);                     // with operator
User::create(['name' => 'Arc', 'email' => '...']);
User::update($id, ['name' => 'Updated']);
User::delete($id);
User::count();                                   // total count
User::exists();                                  // any rows exist
User::sum('age');                                // aggregate
User::avg('age');
User::min('age');
User::max('age');

User::query()->where('active', 1)->orderBy('name')->limit(10)->get();
User::query()->whereNull('email')->count();
User::query()->whereIn('role', ['admin', 'editor'])->get();

use Arc\Validation\Validator;

$validator = Validator::make($_POST, [
    'name'  => '->fails()) {
    $errors = $validator->errors();
}
$validated = $validator->validated();

'code' => 'regex:^[a-z]+\d+$'

Validator::make($data, $rules, [
    'email.

use Arc\Http\Session;

$session = new Session();
$session->start();
$session->set('user_id', 42);
$session->get('user_id');            // 42
$session->has('user_id');            // true

// Flash messages (persist for one request)
$session->setFlash('status', 'Saved successfully!');
$session->flash('status');           // 'Saved successfully!' (then cleared)

$session->regenerate();              // prevent session fixation
$session->destroy();                 // end session

// Simple access
$file = $request->getFile('avatar');

// Validated access (checks size, MIME type, upload validity)
$file = $request->validateFile('avatar', maxBytes: 5_242_880, allowedMimes: ['image/jpeg', 'image/png']);
// Throws InvalidArgumentException on failure

// config/app.php
return [
    'name'     => $_ENV['APP_NAME'] ?? 'Arc',
    'env'      => $_ENV['APP_ENV'] ?? 'production',
    'debug'    => (bool) ($_ENV['APP_DEBUG'] ?? false),
    'url'      => $_ENV['APP_URL'] ?? 'http://localhost',
    'timezone' => 'UTC',
];

$app->config()->get('app.name');      // 'Arc'
$app->config()->get('app.debug');     // false
$app->config()->set('app.theme', 'dark');

// Explicit binding
$app->bind(PaymentGateway::class, StripeGateway::class);

// Singleton (resolved once)
$app->singleton(Logger::class, FileLogger::class);

// Auto-wiring (resolves constructor dependencies)
$controller = $app->make(UserController::class);

use Arc\Http\Middleware\CorsMiddleware;

// Allow specific origins
$app->addMiddleware(new CorsMiddleware(allowedOrigins: ['https://app.example.com']));

// Allow all origins (for APIs)
$app->addMiddleware(new CorsMiddleware(allowedOrigins: '*'));

// With credentials and custom headers
$app->addMiddleware(new CorsMiddleware(
    allowedOrigins: ['https://app.example.com'],
    allowCredentials: true,
    allowedHeaders: ['Content-Type', 'Authorization', 'X-CSRF-TOKEN'],
));
html
<form method="POST" action="/users/1">
    <?= $this->csrfField()