Skip to content
intermediate Phase 34 · Request Lifecycle

ResultFactory — Creating Results

Creating page, JSON, redirect, and raw result objects using ResultFactory.

45m
0 problems
Topic Progress 0%

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?

Question 1 options

2. Which result type renders a full HTML page?

Question 2 options

3. How do you return JSON from a controller?

Question 3 options

4. What result type is used for internal forwarding?

Question 4 options

Flashcards

Question

What are the ResultFactory result types?

Answer

Page, Json, Redirect, Raw, Forward

Question

How do you set JSON data?

Answer

$result->setData($array)

Question

How do you set a page title?

Answer

$page->getConfig()->setTitle()->set(__('Title'))

Question

How do you create a redirect?

Answer

$this->resultFactory->create(Redirect::class)->setPath('route')

Question

What is Forward result used for?

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;