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.
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 templatesarray $data = []
- Data yang akan diteruskan ke templatebool $return = false
- Jika true, mengembalikan HTML sebagai string daripada langsung outputSebelum 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
]
]);
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');
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]
);
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();
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);
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
]);
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;
}
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')
]);
}
Berikut adalah beberapa praktik terbaik dalam menghasilkan respons:
render()
untuk menghasilkan respons HTMLjson()
atau jsData()
untuk menghasilkan respons JSONassignVar()
atau assignVars()
sebelum merenderredirect()
setelah operasi POST untuk mencegah resubmissionsetFlash()
untuk memberikan feedback setelah redirectjsSuccess()
dan jsValidationError()
untuk respons JSON yang konsistensetTitle()
, setDescription()
, dan setKeywords()