2

I'm trying to implement a basic m2 class override following the M2 Fundamentals Course and it is not working. Here is what I have in my Training/Test/etc/di.xml

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

<preference for="Magento\Catalog\Model\Product" type="Training\Test\Model\Testproduct" />

</config>

And inside the Training\Test\Model\Testproduct.php

<?php
namespace Training\Test\Model;

class Testproduct extends \Magento\Catalog\Model\Product
{

 public function getPrice() {
    return 3;
 }
} 

I understand it's better to do plugins / events, but my question is why is the above not working?

The module is installed and I also ran the following:

php bin/magento cache:flush
rm -Rf var/cache/*
rm -Rf var/di/
rm -Rf var/generation/*
rm -Rf var/page_cache/*
php bin/magento setup:di:compile

It also shows when runnning: php bin/magento module:status

List of enabled modules:
...
Training_Test
  • Looks like your module is not installed, isn't it? – KAndy Nov 30 '15 at 8:06
  • It is installed. I also ran the following: php bin/magento cache:flush 993 rm -Rf var/cache/* 994 rm -Rf var/di/ 995 rm -Rf var/generation/* 996 rm -Rf var/page_cache/* 997 php bin/magento setup:di:compile – CD Brian Nov 30 '15 at 14:36
  • Can you describe how are you setup magento and add module to it? – KAndy Nov 30 '15 at 18:08
  • How I setup Magento? I followed the install guide and everything works fine on that front. I then followed the tutorial for building the module and ran: php -f bin/magento module:enable Training_Test I also, verified that if I change this module code to work as a plugin, it works properly. But overriding a class as above does not work. – CD Brian Nov 30 '15 at 18:23
  • In my view you should not override Magento classes. You may want to use Magento Plugins and extend functionality with your custom logic. – Max Pronko Jan 21 '16 at 0:36
8

You can try this simple module to override \Magento\Catalog\Model\Product class. It 100% works on my local Magento 2 test environment.

Base folder: app\code

Directory tree:

└── Example
    └── OverrideModel
        ├── composer.json
        ├── etc
        │   ├── frontend
        │   │   └── di.xml
        │   └── module.xml
        ├── Model
        │   └── Product.php
        └── registration.php

File: Example/OverrideModel/composer.json

{
    "name": "example/overridemodel",
    "description": "OverrideModel module for Magento 2",
    "type": "magento2-module",
    "version": "1.0.0",
    "license": [
        "OSL-3.0",
        "AFL-3.0"
    ],
    "require": {
        "php": "~5.5.0|~5.6.0|~7.0.0",
        "magento/module-catalog": "~100.0"
    },
    "autoload": {
        "files": [
            "registration.php"
        ],
        "psr-4": {
            "Example\\OverrideModel\\": ""
        }
    }
}

File: Example/OverrideModel/registration.php

<?php

use \Magento\Framework\Component\ComponentRegistrar;

ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Example_OverrideModel', __DIR__);

File: Example/OverrideModel/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Example_OverrideModel" setup_version="1.0.0">
        <sequence>
            <module name="Magento_Catalog"/>
        </sequence>
    </module>
</config>

File: Example/OverrideModel/etc/frontend/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Catalog\Model\Product" type="Example\OverrideModel\Model\Product" />
</config>

File: Example/OverrideModel/Model/Product.php

<?php

namespace Example\OverrideModel\Model;

class Product extends \Magento\Catalog\Model\Product {

    public function getPrice()
    {
        return 3;
    }
}
  • Wish there was a 'highlight' function. Took me ages to see 'extends' rather than 'implements' and finally everything clicked. – Andrew Davie Mar 15 '18 at 9:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.