Request Processing

Pengenalan Request Processing

Request processing adalah proses menangani dan memproses HTTP request yang masuk ke aplikasi. NexaController menyediakan berbagai method untuk mengakses dan memproses data request dengan mudah.

Method Request

NexaController menyediakan beberapa method untuk mengakses data request:

  • getRequest() - Mendapatkan instance NexaRequest
  • getParam(string $key, $default = null) - Mendapatkan parameter dari request (POST, GET, atau URL)
  • getPost(string $key = null, $default = null) - Mendapatkan data POST
  • getGet(string $key = null, $default = null) - Mendapatkan data GET
  • isPost() - Memeriksa apakah request adalah POST
  • isGet() - Memeriksa apakah request adalah GET
  • isAjax() - Memeriksa apakah request adalah AJAX

Mengakses Data Request

Berikut adalah contoh mengakses data request dalam controller:


public function processForm(): void
{
    // Memeriksa method request
    if ($this->isPost()) {
        // Mendapatkan semua data POST
        $allPostData = $this->getPost();
        
        // Mendapatkan data POST tertentu dengan default value
        $name = $this->getPost('name', '');
        $email = $this->getPost('email', '');
        $age = $this->getPost('age', 0);
        
        // Proses data
        $this->useModels('User', 'create', [$name, $email, $age]);
        
        // Redirect setelah proses
        $this->redirect('/success');
        return;
    }
    
    // Mendapatkan data GET
    $id = $this->getGet('id');
    $page = $this->getGet('page', 1);
    
    // Mendapatkan parameter dari URL atau query string
    $category = $this->getParam('category', 'all');
    
    $this->assignVars([
        'id' => $id,
        'page' => $page,
        'category' => $category
    ]);
    
    $this->render('form');
}
        

Input Method

NexaController menyediakan method input() dan inputs() untuk mengakses data request dari berbagai sumber (GET, POST, PUT, DELETE) secara terpadu:


public function handleRequest(): void
{
    // Mendapatkan nilai dari request (POST, GET, PUT, DELETE)
    $id = $this->input('id');
    $name = $this->input('name', 'Guest');
    $email = $this->input('email');
    
    // Mendapatkan semua input
    $allInputs = $this->inputs();
    
    // Proses data
    $this->assignVars([
        'id' => $id,
        'name' => $name,
        'email' => $email,
        'all_inputs' => $allInputs
    ]);
    
    $this->render('result');
}
        

URL dan Path

NexaController menyediakan berbagai method untuk mengakses informasi URL dan path:

  • getRequestUri() - Mendapatkan URI request
  • getPath() - Mendapatkan path request
  • getCleanPath() - Mendapatkan path request yang sudah dibersihkan
  • getCurrentUrl() - Mendapatkan URL saat ini
  • url(string $path = '') - Membuat URL relatif
  • getQuery(string $key, $default = null) - Mendapatkan parameter query string
  • getQueryParams() - Mendapatkan semua parameter query string

public function urlInfo(): void
//example.com/products/category/electronics?page=2&sort=price // Membuat URL $homeUrl = $this->url(); // / $productsUrl = $this->url('products'); // /products // Mendapatkan query parameters $page = $this->getQuery('page', 1); // 2 $sort = $this->getQuery('sort'); // price $allParams = $this->getQueryParams(); // ['page' => 2, 'sort' => 'price'] $this->assignVars([ 'request_uri' => $requestUri, 'path' => $path, 'clean_path' => $cleanPath, 'current_url' => $currentUrl, 'home_url' => $homeUrl, 'products_url' => $productsUrl, 'page' => $page, 'sort' => $sort, 'all_params' => $allParams ]); $this->render('url_info');
        

Path Segments

NexaController menyediakan method untuk mengakses segmen path:

  • getPathSegments() - Mendapatkan semua segmen path
  • getPathSegment(int $index, string $default = '') - Mendapatkan segmen path tertentu
  • getSlug(int $index = 0, string $default = '') - Mendapatkan slug dari path
  • getPart(int $index = 0, string $default = '') - Mendapatkan bagian dari path
  • getSlugCount() - Mendapatkan jumlah slug
  • getSlugValues() - Mendapatkan semua nilai slug

// Untuk URL: /products/category/electronics/brand/samsung
public function pathSegments(): void
{
    // Mendapatkan semua segmen path
    $segments = $this->getPathSegments();  // ['products', 'category', 'electronics', 'brand', 'samsung']
    
    // Mendapatkan segmen tertentu
    $segment0 = $this->getPathSegment(0);  // products
    $segment1 = $this->getPathSegment(1);  // category
    $segment2 = $this->getPathSegment(2);  // electronics
    
    // Mendapatkan slug
    $slug0 = $this->getSlug(0);            // products
    $slug1 = $this->getSlug(1);            // category
    $slug2 = $this->getSlug(2);            // electronics
    
    // Mendapatkan jumlah slug
    $slugCount = $this->getSlugCount();    // 5
    
    // Mendapatkan semua nilai slug
    $slugValues = $this->getSlugValues();  // ['products', 'category', 'electronics', 'brand', 'samsung']
    
    $this->assignVars([
        'segments' => $segments,
        'segment0' => $segment0,
        'segment1' => $segment1,
        'segment2' => $segment2,
        'slug0' => $slug0,
        'slug1' => $slug1,
        'slug2' => $slug2,
        'slug_count' => $slugCount,
        'slug_values' => $slugValues
    ]);
    
    $this->render('path_segments');
}
        

Headers dan Server Info

NexaController menyediakan method untuk mengakses headers HTTP dan informasi server:

  • getHeaders() - Mendapatkan semua headers
  • getHeader(string $header, string $default = '') - Mendapatkan header tertentu
  • hasHeader(string $header) - Memeriksa keberadaan header
  • getClientIP() - Mendapatkan IP client
  • getUserAgent() - Mendapatkan user agent
  • getServerInfo(?string $key = null) - Mendapatkan informasi server
  • getEnvironmentInfo() - Mendapatkan informasi environment

public function requestInfo(): void
{
    // Mendapatkan headers
    $allHeaders = $this->getHeaders();
    $contentType = $this->getHeader('Content-Type');
    $userAgent = $this->getHeader('User-Agent');
    $hasAccept = $this->hasHeader('Accept');
    
    // Mendapatkan informasi client
    $clientIP = $this->getClientIP();
    $userAgentString = $this->getUserAgent();
    
    // Mendapatkan informasi server
    $serverSoftware = $this->getServerInfo('SERVER_SOFTWARE');
    $documentRoot = $this->getServerInfo('DOCUMENT_ROOT');
    $allServerInfo = $this->getServerInfo();
    
    // Mendapatkan informasi environment
    $envInfo = $this->getEnvironmentInfo();
    
    $this->assignVars([
        'all_headers' => $allHeaders,
        'content_type' => $contentType,
        'user_agent' => $userAgent,
        'has_accept' => $hasAccept,
        'client_ip' => $clientIP,
        'user_agent_string' => $userAgentString,
        'server_software' => $serverSoftware,
        'document_root' => $documentRoot,
        'all_server_info' => $allServerInfo,
        'env_info' => $envInfo
    ]);
    
    $this->render('request_info');
}
        

Request Method dan AJAX

NexaController menyediakan method untuk memeriksa method request dan AJAX:

  • getRequestMethod() - Mendapatkan method request (GET, POST, PUT, DELETE)
  • isRequestMethod(string $method) - Memeriksa apakah request menggunakan method tertentu
  • isPost() - Memeriksa apakah request adalah POST
  • isGet() - Memeriksa apakah request adalah GET
  • isAjax() - Memeriksa apakah request adalah AJAX

public function handleRequest(): void
{
    // Mendapatkan method request
    $method = $this->getRequestMethod();  // GET, POST, PUT, DELETE
    
    // Memeriksa method request
    $isPut = $this->isRequestMethod('PUT');
    $isDelete = $this->isRequestMethod('DELETE');
    $isPost = $this->isPost();
    $isGet = $this->isGet();
    
    // Memeriksa AJAX request
    $isAjax = $this->isAjax();
    
    if ($isAjax) {
        // Handle AJAX request
        $data = ['success' => true, 'message' => 'AJAX request processed'];
        $this->json($data);
        return;
    }
    
    if ($isPost) {
        // Handle POST request
        $this->processFormData();
        return;
    }
    
    if ($isGet) {
        // Handle GET request
        $this->showForm();
        return;
    }
    
    if ($isPut) {
        // Handle PUT request
        $this->updateResource();
        return;
    }
    
    if ($isDelete) {
        // Handle DELETE request
        $this->deleteResource();
        return;
    }
    
    // Default handling
    $this->render('default');
}
        

Validasi Input

NexaController menyediakan method untuk validasi input:

  • validateRequiredFields(array $fields) - Memvalidasi field yang wajib diisi
  • sanitize(string $input) - Membersihkan input dari karakter berbahaya
  • validateForm(array $rules, bool $redirectOnError = true, bool $flashErrors = true) - Memvalidasi form
  • validateSingleField(string $field, string $validationType, int $minLength = null, string $customMessage = null) - Memvalidasi field tunggal

public function register(): void
{
    if ($this->isPost()) {
        // Validasi field yang wajib diisi
        $requiredFields = ['username', 'email', 'password', 'confirm_password'];
        $missingFields = $this->validateRequiredFields($requiredFields);
        
        if (!empty($missingFields)) {
            $this->setFlash('error', 'Harap isi semua field yang wajib diisi');
            $this->redirect('/register');
            return;
        }
        
        // Sanitize input
        $username = $this->sanitize($this->getPost('username'));
        $email = $this->sanitize($this->getPost('email'));
        
        // Validasi form dengan aturan validasi
        $validationRules = [
            'username' => 'required|min:3|max:20|alphanumeric',
            'email' => 'required|email',
            'password' => 'required|min:8',
            'confirm_password' => 'required|same:password'
        ];
        
        $validationResult = $this->validateForm($validationRules);
        
        if ($validationResult) {
            // Form valid, proses registrasi
            $this->useModels('User', 'register', [
                'username' => $username,
                'email' => $email,
                'password' => $this->getPost('password')
            ]);
            
            $this->setFlash('success', 'Registrasi berhasil! Silakan login.');
            $this->redirect('/login');
            return;
        }
        
        // Jika validasi gagal, validateForm() akan otomatis menetapkan flash errors
        // dan redirect kembali ke form jika $redirectOnError = true
    }
    
    $this->render('auth/register');
}
        

Request Analytics

NexaController menyediakan method untuk menganalisis request:

  • getRequestAnalytics() - Mendapatkan analisis request
  • getRequestJson() - Mendapatkan analisis request dalam format JSON
  • assignRequestData(string $varName = 'request_data') - Menetapkan data request ke template
  • debugRequest(bool $detailed = false) - Menampilkan informasi debug request

public function analyzeRequest(): void
{
    // Mendapatkan analisis request
    $analytics = $this->getRequestAnalytics();
    
    // Mendapatkan analisis request dalam format JSON
    $jsonAnalytics = $this->getRequestJson();
    
    // Menetapkan data request ke template
    $this->assignRequestData('request_info');
    
    // Atau menetapkan data analisis secara manual
    $this->assignVars([
        'analytics' => $analytics,
        'json_analytics' => $jsonAnalytics
    ]);
    
    // Untuk debugging
    if ($this->getGet('debug') === '1') {
        $this->debugRequest(true);
        exit;
    }
    
    $this->render('analytics');
}
        

Best Practices

Berikut adalah beberapa praktik terbaik dalam memproses request:

  • Selalu validasi dan sanitize input user
  • Gunakan method yang sesuai untuk mengakses data request (getPost(), getGet(), dll.)
  • Manfaatkan method validasi untuk memastikan data yang diterima valid
  • Periksa method request (isPost(), isGet()) sebelum memproses data
  • Gunakan flash messages untuk memberikan feedback setelah memproses form
  • Redirect setelah POST untuk mencegah resubmission
  • Tangani AJAX request secara khusus dengan method isAjax()
  • Gunakan method getParam() untuk mengakses parameter dari berbagai sumber