Examples

Real-world code samples for WPZylos HTTP.

REST API Controller

use WPZylos\Framework\Http\Request;
use WPZylos\Framework\Http\Response;

class ProductController
{
    public function index(Request $request): Response
    {
        $page = $request->query('page', 1);
        $perPage = $request->query('per_page', 10);

        $products = $this->productService->paginate($page, $perPage);

        return Response::json([
            'data' => $products,
            'meta' => ['page' => $page, 'per_page' => $perPage]
        ]);
    }

    public function store(StoreProductRequest $request): Response
    {
        $product = $this->productService->create($request->validated());

        return Response::json(['data' => $product], 201);
    }

    public function show(Request $request, int $id): Response
    {
        $product = $this->productService->find($id);

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

        return Response::json(['data' => $product]);
    }
}

AJAX Handler

class SettingsController
{
    public function save(Request $request): Response
    {
        // Nonce verification (if not auto-handled by router)
        if (!wp_verify_nonce($request->input('_wpnonce'), 'save_settings')) {
            return Response::json(['error' => 'Invalid nonce'], 403);
        }

        $settings = $request->only(['option1', 'option2', 'option3']);

        foreach ($settings as $key => $value) {
            update_option("myplugin_{$key}", sanitize_text_field($value));
        }

        return Response::json(['success' => true, 'message' => 'Settings saved']);
    }
}

File Upload

class UploadController
{
    public function upload(Request $request): Response
    {
        $file = $request->file('file');

        if ($file === null) {
            return Response::json(['error' => 'No file uploaded'], 400);
        }

        // Validate file
        $allowed = ['image/jpeg', 'image/png', 'image/gif'];
        if (!in_array($file['type'], $allowed)) {
            return Response::json(['error' => 'Invalid file type'], 422);
        }

        // Handle upload using WordPress
        require_once(ABSPATH . 'wp-admin/includes/file.php');
        $upload = wp_handle_upload($file, ['test_form' => false]);

        if (isset($upload['error'])) {
            return Response::json(['error' => $upload['error']], 500);
        }

        return Response::json([
            'url' => $upload['url'],
            'file' => $upload['file']
        ]);
    }
}

Form Request Validation

class UpdateProfileRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'display_name' => ['required', 'string', 'max:100'],
            'email' => ['required', 'email'],
            'bio' => ['nullable', 'string', 'max:500'],
            'website' => ['nullable', 'url'],
        ];
    }

    public function messages(): array
    {
        return [
            'display_name.required' => 'Please enter your name',
            'email.email' => 'Please enter a valid email address',
        ];
    }

    public function authorize(): bool
    {
        return is_user_logged_in();
    }
}