Я пытаюсь использовать параметр, который я установил в service.yaml как таковой:
параметры: app.path.users_profile_picture: загрузки/пользователи/профиль-изображение
Непосредственно из пользовательского объекта, и я не могу понять, как это сделать?
Дело в том, что для VichUploaderbundle я должен был установить этот параметр в service.yaml и мне нужно использовать это значение в моем User Entity, было бы чище, если бы я использовал этот параметр вместо того, чтобы переписывать путь в моем Entity
У меня тоже есть VichUploadebundle, но мне не нужен сервисный параметр в моей сущности.
Я делаю это по своей причине. Но в любом случае, так нет никакого способа добиться того, что я хочу.. ?
Нет, на мой взгляд, это невозможно и не нужно. Но все же некоторая путаница в вашем вопросе о том, что у вас нет пути в вашей базе данных, когда вы используете VichUploader. VichUploader имеет свое определение в файле yaml, и всякий раз, когда вы вызываете поле VichUploader, доступ к этим параметрам будет осуществляться автоматически.
У меня нет проблем с использованием vichUploader, я просто пытаюсь выполнить эту публичную функцию getProfilePicture(): ?string { return '/uploads/users/profile-picture/'.$this->profilePicture; } для моих нужд удобнее возвращать весь путь вместо добавления префикса перед рендерингом изображения. Также мне нужно будет использовать его как API
Я думаю, вы не использовали vich_uploader_asset для отображения изображения, не так ли? {{ vich_uploader_asset(Entity.Field, 'NameOfDefinitionInYAMLForUpload') }}. Замените Entity.Field на свой entity.profilePicture.
Пожалуйста, не говорите мне, что вы хотите возиться с файловой системой внутри сущностей. Это пахнет за много миль.






Я не уверен, что вы пытаетесь сделать и почему, похоже, что может быть лучший способ добиться того, чего вы хотите.
При этом можно использовать параметр из вашего 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()).
На мой взгляд, это неверный подход. Вы не можете внедрять службы или параметры службы в сущность. Вы должны продолжить работу со службой, которая внедряется в контроллер, где вы затем получаете базовый путь для изображений профиля пользователя.