Symfony 3.4: PropertyAccessor с расширением ветки не находит ключ объекта - PullRequest
0 голосов
/ 25 сентября 2018

вот моя проблема: я хотел бы создать расширение ветки для перевода содержимого моей базы данных.Но когда я вызываю ветку расширения «translate», symfony возвращает исключение, потому что не находит ключ, соответствующий объекту.

Я впервые использую свойство Symfony propertyAccessor, поэтому, возможно, мой вызов неверный.Если кто-то, кто уже использовал propertyAccessor, мог бы зарегистрировать меня.

Вот код:

расширение ветки:

class TranslateExtension extends \Twig_Extension
{
    /**
     *
     * @var string
     */
    protected $locale;

    /**
     *
     * @var string
     */
    protected $defaultLocale;

    /**
     *
     * @var \Symfony\Component\PropertyAccess\PropertyAccessor
     */
    protected $propertyAccessor;

    public function __construct(RequestStack $requestStack)
    {
        if($requestStack->getMasterRequest())
        {
            $this->locale = $requestStack->getMasterRequest()->getLocale();
            $this->defaultLocale = $requestStack->getMasterRequest()->getDefaultLocale();
        }

        $this->propertyAccessor = PropertyAccess::createPropertyAccessor();
    }

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('translate', array($this, 'translate')),
        );
    }

    public function translate($array, $key)
    {
        if(!is_array($array) && method_exists($array, 'toArray'))
        {
            $array = $array->toArray();
        }
        elseif(!is_array($array))
        {
            throw new \Exception('Translation need an array or an object wich implements "toArray"');
        }
        if(isset($array[$this->locale]))
        {
            return $this->propertyAccessor->getValue($array[$this->locale], $key);
        }
        if(isset($array[$this->defaultLocale]))
        {
            return $this->propertyAccessor->getValue($array[$this->defaultLocale], $key);
        }
        else
        {
            throw new \Exception('Object key "'.$key.'" not translated');
        }
    }


    public function getName()
    {
        return 'translate';
    }
}

Мой класс перевода:

class GlasswareTranslation
{
    /**
     * @ORM\Column(name="id_glassware_translation", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @var integer
     */
    private $id;

    /**
     * @var string
     * @ORM\Column(name="description", type="string", length=45)
     */
    private $description;


    /**
     * @ORM\ManyToOne(targetEntity="CocktailGlassware", inversedBy="glassTranslation",cascade={"persist"})
     * @ORM\JoinColumn(name="id_cocktail_glassware", referencedColumnName="id_cocktail_glassware")
     * @var CocktailGlassware
     */
    private $glasses;

    /**
     * @var string
     * @ORM\Column(name="locale", type="string", length=45)
     */
    private $locale;

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param int $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }

    /**
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * @param string $description
     */
    public function setDescription($description)
    {
        $this->description = $description;
    }

    /**
     * @return CocktailGlassware
     */
    public function getGlasses()
    {
        return $this->glasses;
    }

    /**
     * @param Cocktail $glasses
     */
    public function setGlasses($glasses)
    {
        $this->glasses = $glasses;
    }

    /**
     * @return mixed
     */
    public function getLocale()
    {
        return $this->locale;
    }

    /**
     * @param mixed $locale
     */
    public function setLocale($locale)
    {
        $this->locale = $locale;
    }

}

сущность, которую я хочу перевести:

class CocktailGlassware
{
    /**
     * @ORM\Column(name="id_cocktail_glassware", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @var integer
     *
     * @Expose
     */
    private $id;

    /**
     * @var string
     * @ORM\Column(name="name", type="string", length=255, unique=true)
     * @Assert\Length(min=2, max=30)
     * @Expose
     */
    private $name;

    /**
     * @var string
     * @ORM\Column(name="name_fr", type="string", length=255, unique=true)
     * @Assert\Length(min=2, max=30)
     * @Expose
     */
    private $nameFr;

    /**
     * @var \DateTime
     * @ORM\Column(name="updated_at", type="datetime", nullable=true)
     */
    private $updatedAt;

    /**
     * @ORM\Column(name="archived", type="boolean")
     */
    private $archived = false;

    /**
     * @ORM\OneToOne(targetEntity="Image", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="id_image", referencedColumnName="id")
     * @Assert\Valid()
     */
    private $image;

    /**
     * L'url de l'image
     * @Expose
     */
    private $imageUrl;

    /**
     * @ORM\OneToMany(targetEntity="GlasswareTranslation", mappedBy="glasses", indexBy="languages", cascade={"all"}, fetch="EAGER")
     * @var CocktailTranslation[]
     */
    private $glassTranslation;

    public function __construct()
    {
        $this->glassTranslation = new ArrayCollection();
    }

    /**
     * Update last sync date
     *
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function updateDate()
    {
        $this->setUpdatedAt(new \Datetime());
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param int $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }

    /**
     * @return \DateTime
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    /**
     * @param \DateTime $updatedAt
     */
    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;
    }

    /**
     * @return string
     */
    public function getNameFr()
    {
        return $this->nameFr;
    }

    /**
     * @param string $nameFr
     */
    public function setNameFr($nameFr)
    {
        $this->nameFr = $nameFr;
    }

    /**
     * @return mixed
     */
    public function getArchived()
    {
        return $this->archived;
    }

    /**
     * @param mixed $archived
     */
    public function setArchived($archived)
    {
        $this->archived = $archived;
    }

    /**
     * @return mixed
     */
    public function getImage()
    {
        return $this->image;
    }

    /**
     * @param mixed $image
     */
    public function setImage($image)
    {
        $this->image = $image;
    }

    /**
     * @return mixed
     */
    public function getImageUrl()
    {
        return $this->imageUrl;
    }

    /**
     * @param mixed $imageUrl
     */
    public function setImageUrl($imageUrl)
    {
        $this->imageUrl = $imageUrl;
    }

    /**
     * @return CocktailTranslation[]
     */
    public function getGlassTranslation()
    {
        return $this->glassTranslation;
    }

    /**
     * @param CocktailTranslation[] $glassTranslation
     */
    public function setGlassTranslation($glassTranslation)
    {
        $this->glassTranslation = $glassTranslation;
    }

}

и вот как я называю свое расширение в моем представлении, Symfony возвращает мне "Ключ объекта" описание "не переведено")

      {% for key, glass in glasses %}
                <div>
                    <div class="cocktail-glass {% if glass == cocktail.glassware %} active {% endif %}">
                        <img class="glassware-icon" {% if glass.image is not null %} src="{{ asset(glass.image.webPath) }}" {% endif %} />
                        {#<div class="glassware-icon-label">{{ glass.name }}</div>#}
                        <div class="glassware-icon-label">{{ translate(glass.glassTranslation, 'description' ) }}</div>
                    </div>

                    <input type="radio" id="cocktail_glassware_{{ loop.index }}"
                           name="cocktail[glassware]" required="required" value="{{ glass.id }}"
                            {% if glass == cocktail.glassware %}
                        checked="checked"
                            {% endif %}>
                </div>
            {% endfor %}
...