Symfony 4 - Как использовать параметр service.yaml из Entity

Я пытаюсь использовать параметр, который я установил в service.yaml как таковой:

параметры: app.path.users_profile_picture: загрузки/пользователи/профиль-изображение

Непосредственно из пользовательского объекта, и я не могу понять, как это сделать?

На мой взгляд, это неверный подход. Вы не можете внедрять службы или параметры службы в сущность. Вы должны продолжить работу со службой, которая внедряется в контроллер, где вы затем получаете базовый путь для изображений профиля пользователя.

rebru 16.06.2019 16:47

Дело в том, что для VichUploaderbundle я должен был установить этот параметр в service.yaml и мне нужно использовать это значение в моем User Entity, было бы чище, если бы я использовал этот параметр вместо того, чтобы переписывать путь в моем Entity

naspy971 16.06.2019 16:51

У меня тоже есть VichUploadebundle, но мне не нужен сервисный параметр в моей сущности.

rebru 16.06.2019 16:52

Я делаю это по своей причине. Но в любом случае, так нет никакого способа добиться того, что я хочу.. ?

naspy971 16.06.2019 16:54

Нет, на мой взгляд, это невозможно и не нужно. Но все же некоторая путаница в вашем вопросе о том, что у вас нет пути в вашей базе данных, когда вы используете VichUploader. VichUploader имеет свое определение в файле yaml, и всякий раз, когда вы вызываете поле VichUploader, доступ к этим параметрам будет осуществляться автоматически.

rebru 16.06.2019 16:58

У меня нет проблем с использованием vichUploader, я просто пытаюсь выполнить эту публичную функцию getProfilePicture(): ?string { return '/uploads/users/profile-picture/'.$this->profilePicture; } для моих нужд удобнее возвращать весь путь вместо добавления префикса перед рендерингом изображения. Также мне нужно будет использовать его как API

naspy971 16.06.2019 17:02

Я думаю, вы не использовали vich_uploader_asset для отображения изображения, не так ли? {{ vich_uploader_asset(Entity.Field, 'NameOfDefinitionInYAMLForUpload') }}. Замените Entity.Field на свой entity.profilePicture.

rebru 16.06.2019 17:08

Пожалуйста, не говорите мне, что вы хотите возиться с файловой системой внутри сущностей. Это пахнет за много миль.

emix 22.06.2019 12:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
720
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, что вы пытаетесь сделать и почему, похоже, что может быть лучший способ добиться того, чего вы хотите.

При этом можно использовать параметр из вашего services.yaml в объекте, но вы не можете внедрить его непосредственно в конструктор объекта. Если вы используете Doctrine, вы можете внедрить его, подписавшись на событие postLoad, которое отправляется после создания объекта с помощью entityManager.

Допустим, у вас есть объект User с атрибутом параметра services.yaml, который вы хотите использовать:

<?php

namespace App\Entity;

private $serviceArgument;

class User
{
    /**
     * @return mixed
     */
    public function getServiceArgument()
    {
        return $this->serviceArgument;
    }

    /**
     * @param mixed $serviceArgument
     */
    public function setServiceArgument($serviceArgument): void
    {
        $this->serviceArgument = $serviceArgument;
    }
}

Вам нужен EventSubscriber, чтобы вы могли делать что-то на мероприятии postLoad:

<?php

namespace App\EventSubscriber;

use App\Entity\User;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use Doctrine\ORM\Events;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class UserSubscriber implements EventSubscriberInterface
{
    protected $serviceArgument;

    // Inject param from services.yaml
    public function __construct($serviceArgument)
    {
        $this->serviceArgument = $serviceArgument;
    }

    // Listen to postLoad event
    public static function getSubscribedEvents()
    {
        return array(
            Events::postLoad,
        );
    }

    // Set the services.yaml param on the entity
    public function postLoad(LifecycleEventArgs $args)
    {
        $user = $args->getObject();

        if ($user instanceof User) {
            $user->setServiceArgument($this->serviceArgument);
        }
    }
}

Затем в вашем services.yaml вам нужно настроить подписчика и передать нужный параметр:

# config/services.yaml
services:
    _defaults:
        autowire: true     
        autoconfigure: true 
        public: false       

    App\EventSubscriber\UserSubscriber:
        tags:
            - { name: doctrine.event_listener, event: postLoad }
        arguments:
            $serviceArgument: 'Argument from my services.yaml'

Теперь вы можете использовать свой параметр в своей сущности (User::getServiceArgument()).

Другие вопросы по теме