Nefunkcny extension method

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xrep
Člen | 51
+
0
-

Ahoj,

snažím sa vytvoriť extension method a to nasledovne.

Som v handleri (niečo ako tu → https://github.com/…/en/index.md sekcia Configuring services), ktorý spravuje Doctrine entitu s názvom Page.A tam sa snažím pridať metódu do Page, ktorá mi sprístupní nejaké atribúty navyše.

Čiže to vyzerá nejako takto, všetken kód je v konštruktore

<?php
$this->contentAttributes    = new ContentAttributes( $this->eMan );
$this->pages = $entityManager->getRepository( Page::getClassName() );
//extension methods
Page::extensionMethod( 'attr', function ( Page $that ) {
	return $this->contentAttributes->getContentAttributesAssoc( $that->getId(), $that->lang->getId(), 'page' );
});
?>

ale po zavolaní

<?php
$p = $this->contents->findPage( [  'id' => 6 ] );
dump($p->attr());
?>

to hádže

Fatal Error
Call to undefined method Closure::invokeArgs()

skúšal som hľadať riešenie, no bezúspešne.

Poradil by mi niekto prosím?

Editoval xrep (13. 10. 2015 15:54)

David Matějka
Moderator | 6445
+
0
-

Jakou verzi nette pouzivas? A z jakeho radku ta chyba vyskoci?

mimochodem, extensionMethod doporucuju nepouzivat

xrep
Člen | 51
+
0
-

Verzia nette by mala byt aktualna, tak ako Kdyby/Doctrine
V composer mam:

"nette/application": "~2.3",
"kdyby/doctrine": "~2.2",

Subor: src/Kdyby/Doctrine/Entities/BaseEntity.php
Riadok: 194

vypis z Tracy:

if ($cb = static::extensionMethod($name)) {
    /** @var \Nette\Callback $cb */
    array_unshift($args, $this);

	return $cb->invokeArgs($args); // tu to haze
}
xrep
Člen | 51
+
0
-

Tak sa zda ze ten problem nastava ked podedim objekt ktory chcem rozsirit z \Kdyby\Doctrine\Entities\BaseEntity. Urobil som teraz podobny pripad, a ak objekt dedi od \Nette\Object, tak to funguje.

David Grudl
Nette Core | 8129
+
0
-

Důvodem je, že Nette\Calback je deprecated a od Nette 2.2 je v Kdyby\Doctrine potřeba $cb->invokeArgs($args) nahradit za call_user_func_array($cb, $args).

xrep
Člen | 51
+
0
-

Zmenil som ten riadok, funkcia sa zavolá a funguje to.
Vďaka, za pomoc!

Editoval xrep (13. 10. 2015 17:46)

ryder
Člen | 17
+
0
-

David Matějka napsal(a):

mimochodem, extensionMethod doporucuju nepouzivat

Můžu prosím vědět, z jakého důvodu doporučuješ extensionMethod nepoužívat? Díky

David Matějka
Moderator | 6445
+
+1
-

@ryder treba

  • zneprehledni to kod – mas metody na ruznych mistech
  • nefunguje staticka analyza (a tedy ani treba napovidani v IDE)
  • casto to svedci o spatnem navrhu
Filip Procházka
Moderator | 4668
+
0
-

Díky za report, opraveno. (Nejraději bych je úplně smazal, ale nechci tam vytvářet BC Break :-/ )