I am trying to replace an argument via configuration file (di.xml)that's been injected in constructor but it throws an error. Any help will be appreciated
Fatal error: Uncaught TypeError: Argument 1 passed to Mage2\VirtualTypes\Model\Device::__construct() must be an instance of Mage2\VirtualTypes\Model\Apple, instance of Mage2\VirtualTypes\Model\Android given, called in /var/www/html/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php on line 93 and defined in /var/www/html/app/code/Mage2/VirtualTypes/Model/Device.php:15 Stack trace:
I removed var/generation, var/di and var/cache folders but it doesn't help. Here is my code sample
class Device implements DeviceInterface
{
/**
* @var Apple
*/
protected $apple;
/**
* Device constructor.
* @param Apple $apple
*/
public function __construct(Apple $apple)
{
$this->apple = $apple;
}
}
di.xml file
<type name="Mage2\VirtualTypes\Model\Device">
<arguments>
<argument name="apple" xsi:type="object">Mage2\VirtualTypes\Model\Android</argument>
</arguments>
</type>
And Android class looks like
class Android
{
/**
* @var AndroidList
*/
protected $androidList;
/**
* Android constructor.
* @param AndroidList $androidList
*/
public function __construct(AndroidList $androidList)
{
$this->androidList = $androidList;
}
}
-
Your Android class must be inherite from Apple class.Sohel Rana– Sohel Rana2017年10月08日 08:17:02 +00:00Commented Oct 8, 2017 at 8:17
-
Ah thank you @SohelRana. I forgot to extend it from Apple classQaiser Ali Bangash– Qaiser Ali Bangash2017年10月08日 09:58:39 +00:00Commented Oct 8, 2017 at 9:58
1 Answer 1
I forgot to extend the Android class from Apple and below is the correct sample code
class Device implements DeviceInterface
{
/**
* @var Apple
*/
protected $apple;
/**
* Device constructor.
* @param Apple $apple
*/
public function __construct(Apple $apple)
{
$this->apple = $apple;
}
}
di.xml file
<type name="Mage2\VirtualTypes\Model\Device">
<arguments>
<argument name="apple" xsi:type="object">Mage2\VirtualTypes\Model\Android</argument>
</arguments>
</type>
Android class
class Android extends Apple
{
/**
* @var AndroidList
*/
protected $androidList;
/**
* Android constructor.
* @param AndroidList $androidList
*/
public function __construct(AndroidList $androidList)
{
$this->androidList = $androidList;
}
}