ResultFactory Overview
ResultFactory creates different result types for controller responses.
Available result types:
Page — Full page with layout
Json — JSON response
Redirect — HTTP redirect
Raw — Raw content response
Forward — Internal forward to another action
Injecting ResultFactory:
public function __construct(
Context $context,
\Magento\Framework\Controller\Result\Factory $resultFactory
) {
parent::__construct($context);
$this->resultFactory = $resultFactory;
}
Creating results:
// Page result
$page = $this->resultFactory->create(
\Magento\Framework\View\Result\Page::class
);
// JSON result
$json = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Json::class
);
// Redirect result
$redirect = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Redirect::class
);
// Raw result
$raw = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Raw::class
);
Page Result
Page results render full HTML pages with layout.
Basic page result:
public function execute()
{
$page = $this->resultFactory->create(
\Magento\Framework\View\Result\Page::class
);
$page->getConfig()->getTitle()->set(__('My Page Title'));
return $page;
}
Page with layout XML:
public function execute()
{
$page = $this->resultFactory->create(
\Magento\Framework\View\Result\Page::class
);
// Set active theme/layout
$page->addHandle('vendor_module_my_page');
// Set page title
$page->getConfig()->getTitle()->set(__('Product Details'));
// Register content block
$block = $page->getLayout()->getBlock('content');
$block->setProduct($product);
return $page;
}
Page with custom layout update:
public function execute()
{
$page = $this->resultFactory->create(
\Magento\Framework\View\Result\Page::class
);
$page->getConfig()->addPageAsset('Vendor_Module::css/custom.css');
$page->getConfig()->addPageAsset('Vendor_Module::js/custom.js');
$page->getConfig()->getTitle()->set(__('Custom Page'));
return $page;
}
JSON Result
JSON results return structured data for APIs and AJAX.
Basic JSON result:
public function execute()
{
$data = [
'status' => 'success',
'message' => 'Product saved',
'data' => [
'id' => $product->getId(),
'name' => $product->getName()
]
];
$json = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Json::class
);
$json->setData($data);
return $json;
}
JSON with HTTP status code:
public function execute()
{
$response = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Json::class
);
$response->setData([
'error' => true,
'message' => 'Validation failed'
]);
$response->setHttpResponseCode(422);
return $response;
}
JSON for AJAX form submission:
public function execute()
{
if (!$this->getRequest()->isAjax()) {
return $this->_redirect('*/*/index');
}
try {
$this->service->process($this->getRequest()->getParams());
$result = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Json::class
);
$result->setData([
'success' => true,
'message' => __('Saved successfully')
]);
return $result;
} catch (\Exception $e) {
$result = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Json::class
);
$result->setData([
'success' => false,
'message' => $e->getMessage()
]);
$result->setHttpResponseCode(500);
return $result;
}
}
Redirect and Raw Results
Redirect and raw results for special response needs.
Redirect result:
public function execute()
{
// Redirect to URL
$redirect = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Redirect::class
);
$redirect->setUrl('https://example.com/page');
return $redirect;
}
Redirect with parameters:
public function execute()
{
$redirect = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Redirect::class
);
// Redirect to controller action
$redirect->setPath('vendor_module/controller/action', [
'id' => $id,
'_current' => true // Keep current params
]);
return $redirect;
}
Raw result:
public function execute()
{
$raw = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Raw::class
);
$raw->setContents('Plain text content');
$raw->setHttpHeaders([
'Content-Type' => 'text/plain',
'Content-Disposition' => 'inline'
]);
return $raw;
}
Forward result:
public function execute()
{
$forward = $this->resultFactory->create(
\Magento\Framework\Controller\Result\Forward::class
);
$forward->setModule('vendor_module');
$forward->setController('other_controller');
$forward->setAction('other_action');
$forward->setParams(['id' => $id]);
return $forward;
}
Quiz
1. What class is used to create result objects?
2. Which result type renders a full HTML page?
3. How do you return JSON from a controller?
4. What result type is used for internal forwarding?
Flashcards
Question
What are the ResultFactory result types?
Click to reveal answer
Answer
Page, Json, Redirect, Raw, Forward
Question
How do you set JSON data?
Click to reveal answer
Answer
$result->setData($array)
Question
How do you set a page title?
Click to reveal answer
Answer
$page->getConfig()->setTitle()->set(__('Title'))
Question
How do you create a redirect?
Click to reveal answer
Answer
$this->resultFactory->create(Redirect::class)->setPath('route')
Question
What is Forward result used for?
Click to reveal answer
Answer
Internal routing to another controller action
Revision Notes
Key Takeaways
- 1. ResultFactory creates Page, Json, Redirect, Raw, and Forward results
- 2. Page result renders full HTML pages with layout
- 3. Json result returns structured data for APIs/AJAX
- 4. Redirect result sends HTTP redirect response
- 5. Forward result internally routes to another action
- 6. Raw result returns plain content without layout
Interview Tips
- • Explain the different result types and when to use each
- • Describe how to create JSON API responses
- • Know how to set HTTP headers on results
- • Discuss page result with custom layout handles
Cheat Sheet
ResultFactory Cheat Sheet
Inject:
private \Magento\Framework\Controller\Result\Factory $resultFactory
Page:
$page = $this->resultFactory->create(Page::class);
$page->getConfig()->setTitle(__('Title'));
return $page;
JSON:
$json = $this->resultFactory->create(Json::class);
$json->setData(['key' => 'value']);
return $json;
Redirect:
$redirect = $this->resultFactory->create(Redirect::class);
$redirect->setPath('route/action');
return $redirect;
Forward:
$forward = $this->resultFactory->create(Forward::class);
$forward->setAction('other_action');
return $forward;