2017-12-17 23 views
0

그냥 빠른 질문입니다. 일부 API를 구축 중입니다. 폼 요청을 처리 할 간단한 부모 클래스를 만드는 것에 대해 생각하고있었습니다.Symfony 4 setter 주입 (부모 클래스)

예를 들어 양식 요청을 쉽게 처리하고 싶다면이 클래스를 확장하면 요청 개체에 액세스하고 해당 개체에서 추출한 데이터를 요청할 수 있으며 즉시 사용할 수있는 여러 가지 방법이 있습니다. 정확히 무엇이 무엇이며 왜 그렇게 중요하지 않습니다.

문제는 :

  1. 내가 우체부를 통해 요청을 보냅니다.
  2. 부모 클래스를 확장하는 클래스에서 요청 개체를 사용하려고하지만 요청 대신 null이 반환됩니다. 당신 그래서

    #generic api form controller 
        App\Controller\Api\ApiFormController: 
         calls: 
          - [setDependencies, ['@request_stack', '@App\Service\Serialization\Serializer']] 
    

    :

어떻게 내가 이런이 정의를 오버라이드 (override) 전부? 지금

모든 컨트롤러가 서비스로 등록 디폴트로 심포니에서 설정합니까 나는 setter 주입을 사용하고 있음을 볼 수있다.

나는 다른 클래스의 클래스를 확장합니다. PostController라고 부르 자. 그래서 :

<?php 

namespace App\Controller\Api; 

use Symfony\Component\HttpFoundation\RequestStack; 

class ApiFormController 
{ 
    /** 
    * @var Request 
    */ 
    public $request; 

    /** 
    * @param RequestStack $requestStack  
    */ 
    public function setDependencies(
     RequestStack $requestStack  
    ) { 
     $this->request = $requestStack;  
    } 
} 

그리고 지금 PostController :이 같은 액세스를 얻을 것으로 기대하고 있었고, 난 내가이 개체에 액세스 할 수없는 이유를 이해 생각

public function get(int $post = null) 
{ 
    dump($this->request); exit; 
} 

. 나는 가능한 한 가장 깨끗한 방법으로 어떻게이 목표를 달성 할 수 있었는지 몇 가지 아이디어를 찾고 있습니다. 나는 준비된 해답을 기대하지는 않지만 암시입니다.

백그라운드에서 이벤트를 설정하는 것에 대해 생각하고 있었습니까? 또한 컨트롤러가 서비스로 연결되는 방식과 관련이 있다고 생각합니다.

+0

내가 질문을하지 않습니다

가장 쉬운 방법은 예를 들어 다음과 같은 방식으로 작동 할 수 있도록,이에 대한 parent 키워드를 사용하는 것입니다 ApiFormController' - 하위 클래스입니까? 왜 서비스를 정의하지 않았습니까? 그리고 왜 YML의 호출 정의에는 두 개의 매개 변수가 포함되어 있지만이 중 하나만 사용합니다. –

+0

마지막 질문부터 시작하겠습니다. 더 명확하게하기 위해 일부 코드를 제거했습니다. 방금이 다른 서비스를 삭제하는 것을 잊었습니다. 이것은 중요하지 않습니다. 언급 한 Connection은 PostController가 ApiFormController (문장의 처음 몇에서 언급 한 아이디어)를 확장한다는 것입니다. "왜 서비스를 정의하지 않았습니까?" - 정확히 무엇 때문에? 전체 기능? 그 아이디어는 내가 확장 할 수있는 컨트롤러와 컨트롤러가 필요한 모든 서비스를 주입하는 것입니다. 기본적으로 내 요청을 처리합니다. 더 자세한 설명이 필요합니까? – Robert

+0

상위 클래스에만 서비스 정의가 있지만 하위 클래스에없는 경우 서비스 정의는 상위 클래스에만 사용됩니다. 하위 클래스에 서비스를 주입하려면 서비스 정의를 작성해야합니다. http://symfony.com/doc/current/service_container/parent_services.html –

답변

1

모두의 핵심 : 심포니는 서브 클래스에 대한 서비스 정의를 선택하지 않는

$this->request = $requestStack; 

당신은 사용해야합니다. 따라서 클래스에 대한 종속성을 정의하고 다른 클래스에서 확장하는 경우이 두 번째 클래스에 대한 종속성도 정의해야합니다. - PostController`와`사이의 연결이`이다

App\Controller\Api\ApiFormController: 
    calls: 
     - [setDependencies, ['@request_stack', '@App\Service\Serialization\Serializer']] 

PostController: 
    parent: App\Controller\Api\ApiFormController 
+1

똑똑! 고마워요! – Robert

+0

오신 것을 환영합니다! –

-1

여기에 몇 가지 문제점이 있습니다.

  1. 이러한 방식으로 종속성을 주입하려면 컨트롤러를 서비스로 정의해야합니다. 자세한 내용은 here을 참조하십시오.

    # config/routes.yaml 
    get_something: 
        path: /
        defaults: { _controller: App\Controller\Api\PostController:get } 
    

    또한, 서비스,하지 ApiFormController로 PostController를 정의해야합니다 :

라우팅은 다음과 같이해야한다.

  1. RequestStack을 주입했지만 속성에 대해 입력 힌트를 요청했습니다.대신

:

$this->request = $requestStack->getMasterRequest(); 
+0

죄송 합니다만 모든 문제가 있습니다. 우선 라우팅이 문제라고 언급하지 않았습니다. 다른 이유는 모르겠지만 컨트롤러가 자동으로 서비스로 정의되었다고 말하는 부분을 놓쳤습니다.요청 정보 : 요청에 대한 유형 힌트는 어디서 볼 수 있습니까? 댓글이 잘못되었지만 문제의 일부가 아닙니다! 주석 (당신이 읽지 않은)에서 언급했듯이 불필요한 코드에서 코드를 제거하기 위해 약간의 코드를 리팩터링했으며 일부 비트와 조각을 놓쳤습니다. 나는 두 개의 컨트롤러를 서비스로 가질 필요가 있고 mainStackStack 객체에 대한 액세스를 원한다. – Robert