Aprende a registrar los modelos de un complemento de terceros antes que el tuyo para evitar que la excepción de la ClaseModeloDeTerceros no exista.

Shopware es extensible y personalizable, o al menos esa es la idea principal detrás del marco. A veces, necesitará extender otro complemento de su propio complemento, en este artículo específicamente los Modelos (Entidades de Doctrine) de otro complemento. Esto por sí mismo (a menos que la entidad objetivo no permita extenderlo, ver Herencia de Doctrine ) no es teóricamente un gran problema.

Por ejemplo, asumiendo que existen un modelo Person del complemento SwagThirdParty, queremos extender este modelo en nuestro propio complemento. El nuevo modelo que se extiende se vería así:

<?php

namespace OurCodeWorldMyPlugin\Models;

use Doctrine\ORM\Mapping as ORM;
use Shopware\Components\Model\ModelEntity;
use Doctrine\Common\Collections\ArrayCollection;

// Modelo del complemento de terceros
use Shopware\CustomModels\SwagThirdPartyPlugin\Person;

// Nuestro nuevo modelo en nuestro complemento que extiende el modelo de otro complemento
class Programmer extends Person
{
    // ... contenido de la clase ... //
}

Como puede ver, el modelo requiere que se ejecute el modelo Person, sin embargo, en algunos casos durante la instalación del complemento, ya sea por la línea de comando o el administrador de complementos, puede encontrar una excepción que especifica que el modelo Person no existe, aunque el SwagThirdPartyPluginexiste y ya está instalado.

Solución

El problema es que, de hecho, el modelo no existirá durante la instalación de tu propio complemento. Esto generalmente ocurre solo con la instalación/reinstalación del complemento con la línea de comando (Shopware CLI Tools), ya que en este entorno, tu complemento se instalará sin tener un contexto de otros complementos de terceros instalados. Para resolver este problema, solo necesitarás registrar los modelos del complemento obteniendolos manualmente durante el evento de instalación de su complemento. 

Abre el Archivo PHP de tu complemento (el archivo Bootstrap), que en nuestro caso es OurCodeWorldMyPlugin.php (carpeta raíz) y agregue el nuevo método privado registerThirdPartyPluginModels a la clase:

<?php

namespace OurCodeWorldMyPlugin;

use Shopware\Components\Plugin;
use Shopware\Components\Plugin\Context\ActivateContext;
use Shopware\Components\Plugin\Context\DeactivateContext;
use Shopware\Components\Plugin\Context\InstallContext;
use Shopware\Components\Plugin\Context\UninstallContext;
use Doctrine\ORM\Tools\SchemaTool;

// Usar modelos
use OurCodeWorldMyPlugin\Models\Programmer;

class OurCodeWorldMyPlugin extends Plugin
{
    /**
     * Durante la instalación de nuestro complemento, actualice el esquema.
     *
     * @param InstallContext $context
     */
    public function install(InstallContext $context)
    {
        // Register models of the third party plugin before registering ours
        $this->registerThirdPartyPluginModels("SwagThirdPartyPlugin");

        // Ahora no deberías obtener una excepción cuando intentes registrar tus nuevos modelos
        // durante el resto de tu código aquí ...
    }

    /**
     * Registra modelos del complemento de terceros antes de continuar con la asignación.
     *
     * Nota: esto agrega una referencia a todos los modelos del complemento con el nombre de pila
     */
    private function registerThirdPartyPluginModels($thirdPartyPluginName)
    {
        try {
            // Como nuestro complemento modifica un modelo de un complemento externo, necesitamos recuperar el complemento
            $plugin = Shopware()->Container()->get('shopware.plugin_manager')->getPluginBootstrap(
                Shopware()->Container()->get('shopware.plugin_manager')->getPluginByName($thirdPartyPluginName)
            );

            // Registrar modelos del SwagThirdPartyPlugin, que nos dan acceso a sus modelos
            // durante la generación del esquema para sus nuevos modelos.
            $plugin->registerCustomModels();
        } catch (\Exception $e) {}
    }
}

Como puedes ver, el nuevo método registra todos los modelos de un complemento por su nombre. Debes ejecutar el método en el fragmento de código que importa el nuevo modelo que requiere el modelo del complemento de terceros (en este caso, la clase Programmer) o verá la excepción.

Que te diviertas ❤️!


Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores