Wpis z mikrobloga

#php #symfony2

mam pytanie o funkcje anonimowe

->add( 'weeks', 'entity', array(
'class' => 'MV\CaravanBundle\Entity\CaravanRow',
'property' => 'line',
'query_builder' => function(EntityRepository $er ) use ( $caravan ) {
return $er->createQueryBuilder('w')
->orderBy('w.dateFrom', 'ASC')
->where('w.caravan = ?1')
->andWhere('w.visible = 1')
->andWhere('w.booked = 0')
->setParameter(1, $caravan);
}
Czemu $caravan musi byc przekazane przez use a nie moze byc tak jak $er? np

function(EntityRepository $er, $caravan ) {..}
  • 5
@qwelukasz: $er zostanie dodany jako argument funkcji przy wywołaniu, a Ty chcesz jeszcze dodać coś z zewnętrznego scope.

Bo tą funkcję anonimową to nie Ty będziesz wywoływał a jakiś form manager, który widząc że w parametrze query_builder dodałeś funkcję anonimową wywoła ją z parametrem $er, skąd od ma wiedzieć, że chcesz tam jeszcze $caravan?
@qwelukasz: trochę to słabe właśnie jest że funkcje anonimowe nie są bindowane przez symfony do np formy bo rozumiem że tam masz $caravan zdefiniowane
@slave89: powinna ona być bindowana do forma, bo tam pewnie zdefiniował tego $caravana, a jeszcze lepiej by było gdyby można było ustawić w jakim scope ma być wołany jakiego typu obiektu i wtedy by robił metodę call
trochę to słabe właśnie jest że funkcje anonimowe nie są bindowane przez symfony do np formy bo rozumiem że tam masz $caravan zdefiniowane


@Jurigag: trochę to niewykonalne, bo tę f-cję anonimową wywołuje EntityType (konkretniej, DoctrineType), który nie ma dostępu do obiektu twojego forma. Zresztą nie widzę żadnego use-case na to, którego normalnie nie załatwia konstrukcja use.

Nie zapominaj że od php 5.4 $this jest automatycznie domyślnie bindowane do zewnętrznego scope czyli