获取会话对象的正确方法?


8

我现在正在为Magento 2编写一个付款模块,并根据
“ Magento扩展质量程序编码标准” CodeSniffer
https://github.com/magento/marketplace-eqp)对其进行检查。

对于我的每个使用(checkout)会话对象的类,CodeSniffer都会发出以下警告:

Session object MUST NOT be requested in constructor. It can only be passed as a method argument.

我通过以下方式获取会话对象:

/**
 * Checkout session object
 *
 * @var \Magento\Checkout\Model\Session
 */
protected $checkoutSession;

/**
 * Constructor
 *
 * @param  \Magento\Checkout\Model\Session $checkoutSession
 * @return void
 */
public function __construct(\Magento\Checkout\Model\Session $checkoutSession)
{
    $this->checkoutSession = $checkoutSession;
}

是否有获取会话对象的正确方法?
我在Magento 2核心代码中找不到任何内容。
我只能在使用方式完全相同的地方找到代码。


您错过了protected $checkoutSession;在建设者之前
Ankit Shah 2016年

就在这里,我只是没有在此示例代码中显示。我将其添加到示例中以提高可读性
Robert M.

同样的问题,如果有解决方案,请分享
Nikhil Vaghela

Answers:


4

Magento Docs在说

如果一个类的构造函数特别耗费资源,那么当另一个类依赖它时,如果在特定请求期间最终不需要使用昂贵的对象,则可能导致不必要的性能影响。

Magento对于这种情况有一个解决方案:代理。代理扩展了其他类,使其成为它们的延迟加载版本。也就是说,只有在实际调用该类的方法之一之后,才创建代理扩展的类的真实实例。代理实现与原始类相同的接口,因此可以在原始类可以使用的任何地方用作依赖项。与父代理不同,代理只有一次依赖:对象管理器。

代理是生成的代码,因此不需要手动编写。(有关更多信息,请参见代码生成。)只需以\ Original \ Class \ Name \ Proxy形式引用一个类,如果该类不存在,则将生成该类。

Magento 2代理

所以,在你的情况下

/**
 * Checkout session object
 *
 * @var \Magento\Checkout\Model\Session\Proxy
 */
protected $checkoutSession;

/**
 * Constructor
 *
 * @param  \Magento\Checkout\Model\Session\Proxy $checkoutSession
 * @return void
 */
public function __construct(\Magento\Checkout\Model\Session\Proxy $checkoutSession)
{
    $this->checkoutSession = $checkoutSession;
}

注意对象\ Magento \ Checkout \ Model \ Session的\ Proxy后缀



0

根据Magento 2 ECGM2编码标准,您首先使用会话类,然后可以将其传递给构造函数,否则将显示此错误

不得在构造函数中请求会话对象。它只能作为方法参数传递。

例:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

    public function __construct(
        ....
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_checkoutSession = $checkoutSession;
        ....
    }
}

@Price Patel我仍然在使用此代码时遇到上述错误。有什么解决方案吗?这是我的代码:名称空间...; 使用Magento \ Checkout \ Model \ Session作为CheckoutSession; 使用Magento \ Customer \ Model \ Session作为CustomerSession;类Test {private $ checkoutSession; 私人$ customerSession; 公共功能__construct(CheckoutSession $ checkoutSession,CustomerSession $ customerSession){$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.