Importování tříd pomocí `use` pro kratší použití konstant

HanzKrtkowicz
Člen | 1
+
0
-

Neexistuje náhodou v Latte nějaký způsob, jak napsat ekvivalent

use App\Some\Long\Module\Path\Dog;

aby pak člověk při přistupování k třídě nemusel psát celou cestu? K třídě chci přistupovat, abych si z ní přečetl konstantu.

Aktuální kód:

<div>
  {foreach $dogs as $dog}
    <div n:class="'dog', $dog->status === App\Some\Long\Module\Path\Dog::STATUS_DEAD ? 'dog--dead'">
      Dog Content
    </div>
  {/foreach}
</div>

Dream kód (nefunkční):

{use App\Some\Long\Module\Path\Dog}

<div>
  {foreach $dogs as $dog}
    <div n:class="'dog', $dog->status === Dog::STATUS_DEAD ? 'dog--dead'">
      Dog Content
    </div>
  {/foreach}
</div>

Popř. je na podobné situace jiná konvence/best practices?

Omlouvám se, jestli jsem to někde přehlídnul v dokumentaci…

Editoval HanzKrtkowicz (22. 10. 2020 13:00)

dakur
Člen | 191
+
0
-

@HanzKrtkowicz Logika do šablony (ideálně) nepatří. Protože však není praktické dělat ji ani v presenterech (mají tendenci pak hodně bobtnat a stejně se to pak musí nacpat do nějakého transfer objectu), osvědčily se nám tzv. data containers (vymyšlený název), což jsou vlastně jen DTO určená pro šablony. Mají veřejné properties, aby se to v šablonách lépe četlo, a zahrnují logiku určenou pro šablony. Tvůj problém by pak byl vyřešen takto:

final class DogDC // zkratka pro data container, jen abych na první pohled v adresáři věděl, co to je
{
  public bool $isDead;

  public function __construct(Dog $dog)
  {
    $this->isDead = $dog->getStatus() === Dog::STATUS_DEAD;
  }
}
<div>
  {foreach $dogs as $dog}
    <div n:class="'dog', $dog->isDead ? 'dog--dead'">
      Dog Content
    </div>
  {/foreach}
</div>

Takový data container může samozřejmě obsahovat i ostatní věci objektu se týkající podobně jako DTO a příp. udělat properties zvenku readonly etc.

Editoval dakur (22. 10. 2020 13:30)

David Grudl
Nette Core | 7420
+
+4
-
{var $DOG = App\Some\Long\Module\Path\Dog::class}
<div>
  {foreach $dogs as $dog}
    <div n:class="'dog', $dog->status === $DOG::STATUS_DEAD ? 'dog--dead'">
      Dog Content
    </div>
  {/foreach}
</div>

Pokud je přímo $dog instanceof App\Some\Long\Module\Path\Dog, pak $dog::STATUS_DEAD