Вызов метода и внедрение метода в модели / неконтроллерном классе - PullRequest
0 голосов
/ 03 мая 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...