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()