Plea
Я прочитал запись "Service Container" - и почти каждую связанную запись - в документации по Symfony 4.Я занимался этим вопросом два раза, каждый раз проводя по 4-6 часов.Я явно просто не понимаю ... пожалуйста, помогите!
Хотите
Я хочу использовать внедрение зависимостей для использования службы (SessionInterface) в модели (Пользователь), но я неЯ хочу использовать конструктор модели, так как тогда мне нужно будет вводить зависимость каждый раз, когда я выполняю гидратацию и создаю экземпляр модели.Я думаю, что я должен быть в состоянии использовать вызов метода и инъекцию сеттера для соответствия этим критериям.
Код
services.yaml
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
Модель
namespace App\Model\System\User;
use App\Model\System\Client\Client;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\User\{EquatableInterface, UserInterface};
class User implements EquatableInterface, UserInterface
{
private $session;
public function __construct(array $properties)
{
// stuff
}
public function clientAssumed(): Client
{
return $this->session->get('foo', 'bar');
}
/**
* @required
*
* @param SessionInterface $session
*/
public function setSession(SessionInterface $session)
{
$this->session = $session;
}
}
Контроллер
namespace App\Controller\Core;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
class CoreBase extends AbstractController
{
/**
* Displays authenticated User landing page.
*
* @Route("/home", name="core_home")
*
* @param Security $security
*
* @return Response
*/
public function landing(Security $security): Response
{
$data = [
'client' => $security->getUser()->clientAssumed(),
];
return $this->render('core/landing.html.twig', $data);
}
}
Сервисная информация
php bin/console debug:container 'App\Model\System\User\User'
.
Information for Service "App\Model\System\User\User"
====================================================
---------------- ----------------------------
Option Value
---------------- ----------------------------
Service ID App\Model\System\User\User
Class App\Model\System\User\User
Tags -
Calls setSession
Public no
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired yes
Autoconfigured yes
---------------- ----------------------------
Результат
Too few arguments to function App\Model\System\User\User::setSession(), 0 passed in /srv/http/wwwroot/gw4/src/Controller/Core/CoreBase.php on line 25 and exactly 1 expected