Skip to content

Instantly share code, notes, and snippets.

@VaclavSir
Last active December 19, 2015 23:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save VaclavSir/6032422 to your computer and use it in GitHub Desktop.
Save VaclavSir/6032422 to your computer and use it in GitHub Desktop.
Takový nápad...
{assertVariables
number => float,
message => string,
property => 'Hell\Model\Property',
identity => 'Nette\Security\IIdentity',
arrayOrIterator => 'Model\Item[]',
optionalParameter => 'SomeType|NULL'
anyType => mixed,
anyTypeOrNull => 'mixed|NULL',
anyArrayOrIterator => 'mixed[]'
}

Jak by to fungovalo

Pokud by některá z vyjmenovaných proměnných neexistovala nebo nebyla požadovaného typu, makro by zařvalo chybou E_NOTICE. Zápis typ[] by akceptoval pole a iterátory, přičemž by vždycky zkontroloval typ všech prvků (kromě mixed[], který by bylo prostě is_array($x) || $x instanceof Traversable).

Motivace

  • Rozšíření Latte o volitelnou typovou kontrolu.
  • Občas na začátku šablony nebo bloku ty očekávané parametry beztak vypisuju (obvykle nějakým pseudo-PHPDoc zápisem).
  • Nepopírám inspiraci Closure Templates. Nechápu, že podobný mechanizmus ještě nemají všechny ostatní šablonovací systémy.

Využití

  • Na začátku šablony.
  • Na začátku bloku.
  • Kdekoli, kde si nejsem 100% jistý typem nějaké proměnné.

RFC

Chceme to implementovat, nebo to je blbost? Nebo už něco takového existuje a já to neznám?

Co si o tom myslíte vy? Napište mi do komentářů. :-)

@JanTvrdik
Copy link

Nechtělo by se mi to psát, ale nápad je to pěkný. Hlavně se mi (nevím pořádně proč) nelíbí ta syntaxe.

Co něco takového:

{assertVariables
   float $number;
   string $message;
   Hell\Model\Property $property;
}

Nebo TypeScript stylem.

{assertVariables
   $number: float;
   $message: string;
   $property: Hell\Model\Property;
}

@JanTvrdik
Copy link

Možná bych experimentálně zkusil vyhazovat chybu i v případě, že dorazí do šablony proměnná, která není uvedena. Programátora by to nutilo mít tu definici vždy kompletní. Pak by to asi chtělo zápis pro proměnné, které se objevit mohou, ale nemusí. Třeba otazníkem:

{assertVariables Hell\Model\Property? $property}

nebo

{assertVariables Hell\Model\Property $property?}

@VaclavSir
Copy link
Author

Syntaxe TypeScript/Pascal stylem by se mi taky líbila víc. Jestli se to v Latte dá udělat, tak tím lépe (zatím jsem žádné Latte makro s parametry nepsal, tak nevím).

Taky bych rád vymyslel lepší název (kratší a méně náchylný na typo), možná {checkTypes}.

Proměnné, které nejsou uvedeny, bych ale nechal být, protože jinak:

  • Nemohli bychom už nikdy přidat žádnou proměnnou do BasePresenteru nebo TemplateFactory (resp. museli bychom pak upravovat úplně všechny šablony).
  • Nešlo by to moc dobře nasadit na stávající projekty.
  • Co s proměnnými, které vytváří Nette ($presenter, $_presenter, $netteHttpResponse apod.)? Buďto bychom je jak u blbejch pokaždé uváděli (a doufali, že se v příští verzi nezmění), nebo by se to chovalo magicky.

@ViliamKopecky
Copy link

Zajímavé. Dlouhé assertVariables bych zkrátil na needs nebo tak něco.

@paranoiq
Copy link

dobrý nápad. šablona by měla definovat své rozhraní, je to přeci jen v podstatě funkce. requires, params?

@PetrP
Copy link

PetrP commented Jul 22, 2013

V připadě block/define by se parametry/typy dali zapisovat jako další parametr (v nette lze něco jako přetížit macro).

{define #block number => float, message => string}

{/define}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment