2017-04-30 4 views
0

튜토리얼을 통해가는 심포니와 속도 일어나려고,이 페이지 (symfony.com/doc/current/forms.html)에서 다음 샘플입니다 : 내가 빨리 전에이 구문을 본 적이 데PHP 구문

$form = $this->createFormBuilder($task) 
    ->add('task', TextType::class) 
    ->add('dueDate', DateType::class) 
    ->add('save', SubmitType::class, array('label' => 'Create Post')) 
    ->getForm(); 

    return $this->render('default/new.html.twig', array(
     'form' => $form->createView(), 
    )); 

외면적으로 보이는 전화 연쇄를 배제하고, "벌거 벗은"화살 각각을 $form의 방법을 가리키는 것으로 해석하는 것이 대부분 정확하다는 것을 알았다. 이 버전에서 올바르게 작동하게되었습니다.

$formBuilder = $this->createFormBuilder($task); 
$formBuilder->add('task', TextType::class); 
$formBuilder->add('dueDate', DateType::class); 
$formBuilder->add('save', SubmitType::class, array('label' => 'Create Post')); 
$form = $formBuilder->getForm(); 

    return $this->render('default/new.html.twig', array(
     'form' => $form->createView(), 
    )); 

원본 샘플을 이해하려고합니다. 겉보기에는 연결이 끊긴 화살표의 올바른 해석이 "첫 번째 줄에 명명 된 개체의 메서드 호출"이면 "->getForm();"줄을 제외한 모든 내용을 설명합니다. 그러나 동일한 규칙이 해당 줄에 적용되면 해당 줄은 "$formBuilder->getForm();"이되며 $ form에 대한 할당이 부족하기 때문에 render() 줄에서 실패합니다. (즉, 빌더의 이름을 $ form으로 유지함).

자습서에 실수가 있습니까? 아니면 누락 된 구문의 미묘한 차이가 있습니까?

("php", "arrow", "syntax", ...)의 조합을 광범위하게 검색했지만 일련의 메소드 호출에서 객체 이름을 생략하는 것에 대해서는 아무 것도 발견하지 못했습니다.

답변

0

사실 이것은 메소드 체이닝입니다. 별도의 메서드 호출 사이의 새로운 줄은 더 나은 코드 가독성을위한 것입니다.

이 :

$formBuilder = $this->createFormBuilder($task); 
$formBuilder->add('task', TextType::class); 

은 다음과 동일합니다 :

$formBuilder = $this->createFormBuilder($task) 
->add('task', TextType::class); 
+0

'FormBuilder :: add'의 정의를 찾아 내서 chaining 된 것을 확인하면 수정 된'FormBuilder' 객체를 반환합니다. 그런 다음 그 집합의 마지막 줄은 반환 형식이 다르긴하지만 마지막 줄이므로 동일한 이름을 사용하면'$ form'이 모두 정의되기 때문에 영리한 트릭입니다. 나는 여전히 코드 내에서 가독성을 위해이 메소드를 변경하고 있으므로 독자는 메소드 정의를 검색 할 필요가 없으므로 튜토리얼은 빠른 설명과 함께 더 낫다. –

1

원본 샘플은 실제로 메소드 체이닝입니다.

이 예를 보면 :

$form = $this->createFormBuilder($task) 
    ->add('task', TextType::class) 
    ->add('dueDate', DateType::class) 
    ->add('save', SubmitType::class, array('label' => 'Create Post')) 
    ->getForm(); 

그것은 단순히 방법으로 체인 수하는 방법 createFormBuilder, add, getform 모두가 $this이 때문에 대부분 각각의 방법에서 return $this;을 반환하는 동일한 클래스에 속하는 것을 의미한다을 다음. TextType::class이고 나머지는 클래스 상수입니다.

+0

'add'와'getForm'은 $ this''에 속하지 않습니다. 'createFormBuilder'는'$ this'에 속하고'FormBuilder [Interface]'를 반환합니다 ** ** 클래스는'add (메소드 체이닝을 위해 리턴하는) 메소드와'getForm' ('Form [Interface]' , 그래서 당신은 더 이상'FormBuilder [Interface]'메소드를 체인 할 수 없지만'Form [Interface]'메소드는 대신 사용할 수 있습니다. – ccKep