Seperti janji saya di tulisan tentang routing sebelumnya, kali ini adalah lanjutannya.
Routing di Magento di-handle oleh satu controller untuk tiap route, di method execute
.
Return dari method itu antara lain: page, json, raw, layout, redirect dan forward.
Page result
Route ini me-return halaman HTML.
Class yang digunakan adalah \Magento\Framework\View\Result\Page
.
Contoh kode:
<?php
namespace Modul\NamaVendor\Controller\Index;
class Index extends \Magento\Framework\App\Action\Action
{
protected $_pageFactory;
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $pageFactory) {
$this->_pageFactory = $pageFactory;
return parent::__construct($context);
}
public function execute()
{
return $this->_pageFactory->create();
}
}
Controller tersebut akan membuat halaman di /blog/index/index
atau cukup disingkat dengan /blog
.
Tentunya frontName ‘blog’ sudah ditentukan di etc/frontend/routes.xml
,
seperti sudah dijelaskan pada tulisan sebelumnya.
Selanjutnya perlu membuat layout xml di /Vendor/NamaModul/etc/frontend/layout/blog_index_index.xml
.
<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
<container name="root">
<block class="Vendor\NamaModul\Block\Blog" name="blog_list" template="Vendor_NamaModul::blog/index.phtml" cacheable="false"/>
</container>
</layout>
Kemudian, buat block1 dan template untuk menentukan template yang dipakai oleh halaman. Seperti ditetapkan di layout xml di atas, maka dibuat 2 file baru:
// Block/Blog/Index.php
<?php
namespace Vendor\NamaModul\Block\Blog;
class Index extends \Magento\Framework\View\Element\Template
{
public function __construct(\Magento\Framework\View\Element\Template\Context $context)
{
parent::__construct($context);
}
public function _prepareLayout()
{
return parent::_prepareLayout();
}
/**
* Contoh data diambil dari model
* @return \Vendor\NamaModul\Model\Blog
*/
public function getBlogList()
{
$blogData = $this->blogModel->getBlog();
return $blogData;
}
}
Pada contoh di atas, data blog mengambil dari model. Tentang model akan dijelaskan di tulisan mendatang.
// view/frontend/web/templates/blog/index.phtml
<?php foreach($block->getBlogList() as $blog) : ?>
<h1><?= $blog->getTitle() ?></h1>
<p><?= $blog->getExcerpt() ?></p>
<?php endforeach; ?>
JSON result
Result ini digunakan untuk membuat response JSON yang lebih general selain REST.
public function __construct(
//...
Magento\Framework\Controller\Result\JsonFactory $jsonResultFactory,
//...
)
{
$this->jsonResultFactory = $jsonResultFactory;
}
public function execute()
{
$result = $this->jsonResultFactory();
$o = new stdClass;
$o->foo = 'bar';
$result->setData($o);
return $result;
}
RAW result
Result ini membuat return yang benar-benar raw, jadi sangat fleksibel untuk membuat response yang tidak biasa.
public function __construct(
//...
Magento\Framework\Controller\Result $rawResultFactory ,
//...
)
{
$this->rawResultFactory = $rawResultFactory;
}
public function execute(
)
{
//...
$result = $this->rawResultFactory->create();
$result->setHeader('Content-Type', 'text/xml');
$result->setContents('<root><science></science></root>);
return $result;
}
Layout result
Layout result sebenarnya raw result, yang berpadu dengan page result. Hanya saja layout result ini tidak membuat seluruh halaman. Jadi yang di-return adalah satu template phtml saja, tidak termasuk header dan footer atau static files (JS, CSS). Dan class yang digunakan adalah sama seperti raw result.
// controller
...
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\Controller\ResultFactory $result,
...
) {
...
$this->resultFactory = $result;
return parent::__construct($context);
}
public function execute()
{
...
return $this->resultFactory->create(ResultFactory::TYPE_LAYOUT);
}
}
Selayaknya page result, perlu dibuat layout xml dan template phtml juga selain controller tersebut.
Redirect result
Result ini akan mengalihkan ke URL yang ditentukan.
public function __construct(
//...
Magento\Framework\Controller\Result\RedirectFactory $resultRedirectFactory
//...
)
{
$this->resultRedirectFactory = $resultRedirectFactory;
}
public function execute()
{
$result = $this->resultRedirectFactory->create();
$result->setPath('*/*/index');
return $result;
}
Forward result
Result ini akan meneruskan ke URL yang telah ditentukan.
public function __construct(
//...
Magento\Framework\Controller\Result\ForwardFactory $resultForwardFactory
//...
)
{
$this->resultForwardFactory = $resultForwardFactory;
}
public function execute()
{
$result = $this->resultForwardFactory->create();
$result->forward('noroute');
return $result;
}
Inspirasi dari Alan Storm.
-
block adalah class khusus yang menjadi jembatan atau penghubung antara layout xml dan template phtml, semua logic yang dipakai oleh template berada di sini yang bisa diakses dengan variable
$block
↩︎