Extend CoreShop Resources
All models in Coreshop are placed in the Coreshop\Component\*ComponentName*\Model
namespaces alongside with their interfaces.
Many models in CoreShop are extended in the Core component. If the model you are willing to override exists in the Core you should be extending the Core one, not the base model from the component.
How to Customize a Model
First things first: If you want to extend coreshop models your Bundle must extend the AbstractResourceBundle
. Next you have set your supported drivers. Just add the following lines of code to your bundle class:
public function getSupportedDrivers(); array
{
return [
CoreShopResourceBundle::DRIVER_DOCTRINE_ORM
];
}
After that have to tell the bundle where your models are. For that, add the override the following method in your bundle class and return the model namespace. Here is an example for the AppBundle
protected function getModelNamespace(): string
{
return "AppBundle\Model";
}
Here a quick overview for you which dictories are important for you, when customizing CoreShop models.
Folder | Description |
---|---|
AcmeBundle/Model or AcmeBundle/Entity |
Where your models are living |
AcmeBundle/config/doctrine/model |
Put your doctrine .yml config files in here |
AcmeBundle/config/serializer |
The serializer configs for the models |
Let’s take the CoreShop\Component\Currency\Model\Currency
as an example. This one is extended in Core. How can you check that?
First of all, you need to find the current used class by doing following:
$ php bin/console debug:container --parameter=coreshop.model.currency.class
As a result you will get the CoreShop\Component\Core\Model\Currency
- this is the class that you need to be extending.
Assuming you want to add a field called flag
1. The first thing to do is to write your own class which will extend the base Currency
class
<?php
namespace AppBundle\Entity;
use CoreShop\Component\Core\Model\Currency as BaseCurrency;
class Currency extends BaseCurrency
{
/**
* @var bool
*/
private $flag;
/**
* @return bool
*/
public function getFlag()
{
return $this->flag;
}
/**
* @param bool $flag
*/
public function setFlag($flag)
{
$this->flag = $flag;
}
}
2. Next define your entity’s mapping.
The file should be placed in AppBundle/Resources/config/doctrine/Currency.orm.yml
AppBundle\Entity\Currency:
type: mappedSuperclass
table: coreshop_currency
fields:
flag:
type: boolean
nullable: true
3. Finally you’ll need to override the model’s class in the app/config/config.yml
.
Under the core_shop_* where * is the name of the bundle of the model you are customizing, in our case it will be the CoreShopCurrencyBundle -> core_shop_currency.
core_shop_currency:
resources:
currency:
classes:
model: AppBundle\Entity\Currency
4. Update the database. There are two ways to do it.
via direct database schema update:
$ php bin/console doctrine:schema:update --force
via migrations: Which we strongly recommend over updating the schema.
$ php bin/console doctrine:migrations:diff
$ php bin/console doctrine:migrations:migrate