Context Object in Magento 2

1. Đặt vấn đề
Quick question:
Mới bắt đầu với Magento bạn có thắc mắc trong một số constructor lại inject 1 object rất quen mà lạ kiểu như
\Magento\Backend\App\Action\Context $context gọi là “Action Context” hay như thế này
\Magento\Backend\Block\Template\Context $context là “Template Context” và còn nữa nhé :smiley:

Vậy $context có nhiệm vụ gì mà chỗ nào cũng thấy có mặt vậy?
Cùng tìm hiểu nhé :smiley_cat:

2. Giải thích
Bây giờ hãy thử tưởng tượng bạn cần phải inject 20 paras trong constructor của rất rất nhiều class để thực hiện những tác vụ cơ bản như getRequest() hay getLayout() thì thật là không hay.
Vì thế Magento đưa context object vào để lưu trữ toàn bộ những function này. Khi muốn sử dụng, chỉ cần inject Context object trong Constructor là có thể sử dụng được.

Tuy nhiên, Context object không có functionality của nó, nó chỉ đóng vai trò container. Thế nên bạn sẽ thấy thằng parent::__construct($context); được sử dụng rất nhiều trong child class.

Thường Context Object được sử dụng trong Block, Helper và Model. 3 thằng này là gì và nhiệm vụ như thế nào thì các bạn tự tìm hiểu nhé :smiley_cat:

Và sau đây là list những function hay được sử dụng của Context object.

Methods from Context object in Block.

$context->getRequest(); // return \Magento\Framework\App\RequestInterface
$context->getUrlBuilder(); // return \Magento\Framework\UrlInterface
$context->getScopeConfig(); // return \Magento\Framework\App\Config\ScopeConfigInterface
$context->getLogger(); // return \Psr\Log\LoggerInterface   
$context->getEventManager(); // return \Magento\Framework\Event\ManagerInterface
$context->getStoreManager(); // return \Magento\Store\Model\StoreManagerInterface
$context->getPageConfig(); // return \Magento\Framework\View\Page\Config
$context->getFilesystem(); // return \Magento\Framework\Filesystem
$context->getViewFileSystem(); // return \Magento\Framework\View\FileSystem
$context->getAppState(); // return \Magento\Framework\App\State
$context->getCache(); // return \Magento\Framework\App\CacheInterface
$context->getSession(); // return \Magento\Framework\Session\SessionManagerInterface
$context->getInlineTranslation(); // return \Magento\Framework\Translate\Inline\StateInterface
$context->getEscaper(); // return \Magento\Framework\Escaper
$context->getLocaleDate(); // return \Magento\Framework\Stdlib\DateTime\TimezoneInterface
$context->getDesignPackage(); // return \Magento\Framework\View\DesignInterface
$context->getLayout(); // return \Magento\Framework\View\LayoutInterface
$context->getSidResolver(); // return \Magento\Framework\Session\SidResolverInterface
$context->getAssetRepository(); // return \Magento\Framework\View\Asset\Repository
$context->getViewConfig(); // return \Magento\Framework\View\ConfigInterface
$context->getCacheState(); // return \Magento\Framework\App\Cache\StateInterface
$context->getFilterManager(); // return \Magento\Framework\Filter\FilterManager

Methods from Context object in Helper.

$context->getRequest(); // return \Magento\Framework\App\RequestInterface
$context->getUrlBuilder(); // return \Magento\Framework\UrlInterface    
$context->getScopeConfig(); // return \Magento\Framework\App\Config\ScopeConfigInterface
$context->getLogger(); // return \Psr\Log\LoggerInterface
$context->getEventManager(); // return \Magento\Framework\Event\ManagerInterface
$context->getModuleManager(); // return \Magento\Framework\Module\Manager
$context->getCacheConfig(); // return \Magento\Framework\Cache\ConfigInterface
$context->getHttpHeader(); // return \Magento\Framework\HTTP\Header
$context->getRemoteAddress(); // return \Magento\Framework\HTTP\PhpEnvironment\RemoteAddress
$context->getUrlEncoder(); // return \Magento\Framework\Url\EncoderInterface
$context->getUrlDecoder(); // return \Magento\Framework\Url\DecoderInterface

Methods from Context object in Model.

$context->getLogger(); // return \Psr\Log\LoggerInterface
$context->getCacheManager(); // return \Magento\Framework\App\CacheInterface
$context->getEventDispatcher(); // return \Magento\Framework\Event\ManagerInterface 
$context->getAppState(); // return \Magento\Framework\App\State
$context->getLogger(); // return \Psr\Log\LoggerInterface

Như vậy bây giờ khi muốn sử dụng \Magento\Store\Model\StoreManagerInterface object trong block
thay vì:
`public function __construct(

    \Magento\Backend\Block\Template\Context $context,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    array $data = []
)
{
    $this->_storeManager = $storeManager;
    parent::__construct($context, $data);
}`

thì nên sử dụng:

`public function __construct(

    \Magento\Backend\Block\Template\Context $context,
    array $data = []
)
{
    $this->_storeManager = $context->getStoreManager();
    parent::__construct($context, $data);
}`
2 Likes