Response Generation

Pengenalan Response Generation

Response generation adalah proses menghasilkan dan mengirimkan respons HTTP ke client. NexaController menyediakan berbagai method untuk menghasilkan respons dengan mudah dan fleksibel, baik berupa HTML, JSON, atau format lainnya.

Rendering Template

Method utama untuk menghasilkan respons HTML adalah render():


// Render template sederhana
$this->render('home/index');

// Render template dengan data
$this->render('products/detail', [
    'product' => $product,
    'related_products' => $relatedProducts
]);

// Render template dan return string HTML (tidak langsung output)
$html = $this->render('partials/product_card', ['product' => $product], true);
        

Parameter render():

  • string $template - Path template relatif terhadap direktori templates
  • array $data = [] - Data yang akan diteruskan ke template
  • bool $return = false - Jika true, mengembalikan HTML sebagai string daripada langsung output

Menetapkan Variabel Template

Sebelum merender template, Anda dapat menetapkan variabel yang akan digunakan dalam template:


// Menetapkan satu variabel
$this->assignVar('product', $product);

// Menetapkan multiple variabel
$this->assignVars([
    'product' => $product,
    'category' => $category,
    'related_products' => $relatedProducts
]);

// Menetapkan variabel dengan append (menggabungkan jika sudah ada)
$this->assignVar('tags', $newTags, true);

// Menetapkan variabel untuk block template
$this->assignBlock('sidebar', [
    'categories' => $categories,
    'popular_tags' => $popularTags
]);

// Menetapkan multiple blocks
$this->assignBlocks([
    'sidebar' => [
        'categories' => $categories,
        'popular_tags' => $popularTags
    ],
    'footer' => [
        'recent_posts' => $recentPosts,
        'social_links' => $socialLinks
    ]
]);
        

Layout dan Template

Anda dapat mengatur layout yang digunakan untuk merender template:


// Mengatur layout
$this->setLayout('admin');

// Menonaktifkan auto render
$this->disableAutoRender();

// Mengatur SEO metadata
$this->setTitle('Product Detail - ' . $product->name);
$this->setDescription($product->short_description);
$this->setKeywords($product->tags);

// Atau menetapkan semua SEO metadata sekaligus
$this->setSEO([
    'title' => 'Product Detail - ' . $product->name,
    'description' => $product->short_description,
    'keywords' => $product->tags,
    'og:image' => $product->image_url
]);

// Menambahkan CSS dan JS
$this->addCSS('/assets/css/product.css');
$this->addJS('/assets/js/product-gallery.js');
        

JSON Response

Untuk menghasilkan respons JSON, gunakan method json() atau jsData():


// Respons JSON sederhana
$this->json([
    'success' => true,
    'data' => $product,
    'message' => 'Product retrieved successfully'
]);

// Respons JSON dengan status code kustom
$this->json([
    'error' => 'Product not found'
], 404);

// Respons JSON yang lebih terstruktur dengan jsData
$this->jsData([
    'product' => $product,
    'related' => $relatedProducts,
    'pagination' => $pagination
]);

// Respons JSON untuk validasi form
$this->jsValidationError([
    'name' => 'Name is required',
    'email' => 'Invalid email format'
], 'Please fix the errors below');

// Respons JSON untuk sukses
$this->jsSuccess('Product created successfully', '/products');

// Respons JSON untuk redirect
$this->jsRedirect([
    'product' => $product
], '/products/' . $product->id, 'Product created successfully');

// Respons JSON untuk validasi
$this->jsValidationResponse(
    $isValid,
    $errors,
    ['product' => $product],
    [],
    'Product created successfully',
    'Please fix the errors below'
);

// Respons JSON boolean
$this->jsBooleanResponse(
    $success,
    'Operation successful',
    'Operation failed',
    ['details' => $details]
);
        

Redirect

Untuk melakukan redirect, gunakan method redirect():


// Redirect sederhana
$this->redirect('/products');

// Redirect dengan status code kustom
$this->redirect('/login', 303);

// Redirect kembali ke halaman sebelumnya
$this->redirectBack();

// Redirect kembali dengan fallback jika tidak ada referer
$this->redirectBack('/products');

// Mendapatkan URL untuk redirect back (tanpa melakukan redirect)
$backUrl = $this->urlBack();
        

Raw Output

Untuk output data mentah atau debugging, gunakan method Raw() atau RawDetailed():


// Output data mentah
echo $this->Raw($data);

// Output data mentah dengan detail lebih lengkap
echo $this->RawDetailed($data);
        

Debugging Response

NexaController menyediakan beberapa method untuk debugging respons:


// Debug data dengan format yang lebih mudah dibaca
$this->dump($data1, $data2, $data3);

// Debug request
$this->debugRequest();

// Debug request dengan detail lebih lengkap
$this->debugRequest(true);

// Debug JSON data
$this->debugJsData([
    'product' => $product,
    'related' => $relatedProducts
]);
        

Response Headers

Anda dapat mengatur headers respons sebelum mengirimkan respons:


// Mengatur header
header('Content-Type: application/json');
header('Cache-Control: no-cache');

// Mengatur status code
http_response_code(201);

// Contoh penggunaan dalam controller
public function downloadFile(): void
{
    $filePath = 'path/to/file.pdf';
    $fileName = 'document.pdf';
    
    if (!file_exists($filePath)) {
        http_response_code(404);
        echo 'File not found';
        return;
    }
    
    // Mengatur headers untuk download file
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename="' . $fileName . '"');
    header('Content-Length: ' . filesize($filePath));
    header('Cache-Control: no-cache');
    
    // Output file
    readfile($filePath);
    exit;
}
        

Delay Response

Untuk menunda respons (misalnya untuk simulasi loading), gunakan method delay():


// Menunda respons selama 2 detik
$this->delay(2);

// Contoh penggunaan dalam controller
public function simulateLoading(): void
{
    // Menunda respons selama 1.5 detik
    $this->delay(1.5);
    
    // Kemudian kirim respons
    $this->json([
        'success' => true,
        'data' => $this->useModels('Product', 'getAll')
    ]);
}
        

Best Practices

Berikut adalah beberapa praktik terbaik dalam menghasilkan respons:

  • Gunakan method render() untuk menghasilkan respons HTML
  • Gunakan method json() atau jsData() untuk menghasilkan respons JSON
  • Tetapkan variabel template dengan assignVar() atau assignVars() sebelum merender
  • Gunakan redirect() setelah operasi POST untuk mencegah resubmission
  • Gunakan setFlash() untuk memberikan feedback setelah redirect
  • Gunakan status code HTTP yang sesuai untuk respons
  • Gunakan method khusus seperti jsSuccess() dan jsValidationError() untuk respons JSON yang konsisten
  • Tetapkan metadata SEO untuk halaman dengan setTitle(), setDescription(), dan setKeywords()