Autor Zpráva
weroro
Profil
Ahoj,

existuje prosím v PHP možnosť používať dekorátory podobne ako to je v TypeScript?

Typescript
const MyDecorator = (): MethodDecorator => {
    return (classInstance: object, methodName: string | symbol, propertyDescriptor: PropertyDescriptor): void => {
        console.log(classInstance, methodName, propertyDescriptor);
    };
};

class ExampleClass {
    @MyDecorator()
    public exampleMethod(): void {
        //.../
    }
}

V PHP by som chcel dosiahnuť rovnakú funkcionalitu, čiže pomocou dekorátoru získať objekt triedy a názov metódy.

Našiel som niečo, čo sa nazýva Atribúty #[Attribute] lenže keď som to skúšal, tak to nerobilo to čo chcem dosiahnuť. Vyzerá to, že to slúži na zapisovanie hodnôt a nie na čítanie.
Pravdepodobne som iba nepochopil ako to funguje a neviem to proste použiť.

Chcem pomocou toho nastavovať hodnoty do routera, kde sa mi odošle Trieda a metóda a ako vstup do "dekorátoru" zadám iba URL a povolené http metódy.

Niečo takéto:
class AboutController {
    #[Route("/about", ["GET"])]
    public function index()
    {
        //.../
    }

    #[Route("/about", ["POST"])]
    public function add()
    {
        //.../
    }

    #[Route("/about", ["PUT"])]
    public function update()
    {
        //.../
    }

    #[Route("/about", ["DELETE"])]
    public function delete()
    {
        //.../
    }
}

Ďakujem za odpovede
N71
Profil *
Atributy v PHP umožňují připojit strukturovaná metadata čitelná pomocí reflexe. Vyšší funkční logiku to samo o sobě neumí. Je to evoluce PHPDoc, kde se o parsování postará už interpret a nemusí to dělat samotný program.
weroro
Profil
Ďakujem. Takže to sa to nedá použiť, tak priamočiaro ako som zvyknutý z TS.

Bude to offtopic, ale existuje v php nejaký design pattern pre konfiguráciu routeru? Jediné čo ma napadá je použiť pole:
$routes = [
    "/about" => [
        "allow" => ["GET", "POST"],
        "controller" => AboutController::class,
        "action" => 'index',
        "middleware" => Auth::class
    ]
];

Je niečo čo je viac prehľadné? Niečo čo by umožňovalo napr. dediť tú autentifikáciu na ďalšie úrovne?
$routes = [
    "/about" => [
        "allow" => ["GET", "POST"],
        "controller" => AboutController::class,
        "action" => 'index',
        "middleware" => Auth::class,

        "children" => [
            "/detail" => [ // /about/detail 
                "allow" => ["GET"],
                "action" => 'detail',
            ]
        ]
    ]
];

Takto mi to príde ako strašný balast a neprehľadné.
Kcko
Profil
weroro:
Nevymýšlej znovu kolo, beztak ho lépe nepostavíš.

doc.nette.org/cs/application/routing
weroro
Profil
Dík, pohrám sa.

Nechcem vymýšľať koleso. Učím sa a lepšie sa mi memoruje ak to budem písať sám. Vŕtať sa v cudzom kóde veľakrát nestačí. Toto nepôjde nikdy do produkcie. Aktívne som s PHP nerobil už nejakú dobu a proste si to chcem nakódiť sám a riešiť chyby.
N71
Profil *
Taky bych to viděl podobně, nevyvíjej součásti frameworku (teda pokud nevyvíjíš framework), radši jej přímo použij. Například Symfony nebo Laravel.
RastyAmateur2
Profil *
weroro:
Aktívne som s PHP nerobil už nejakú dobu
Mohu se ze zvědavosti zeptat, co tě přivádí k tomu se právě PHP znovu učit? Proč to nepíšeš třeba v tom zmíněném TypeScriptu? Web development sice už nedělám, ale strašně dlouho jsem o PHP neslyšel, tak by mě vlastně zajímalo, jestli se stále doopravdy používá.
anonym_
Profil *
RastyAmateur2:
Ano, používá se běžně. Ne úplně v plainu, ale v ČR Nette + Symfony/Laravel/Cake, v zahraničí dtto kromě Nette.
weroro
Profil
RastyAmateur2:
Môj tech stack nie je veľký (ak sa bavíme o technológiách, kde by som bol seniornejší), primárne sa venujem Typescriptu a statickému FE a naučil som sa ZIG (Rust mi nevoňal), keď potrebujem WASM. S PHP som robil dávno a od tej doby sa celkom vyvinul, tak si chcem doplniť vedomosti a ja to robím tak, že v danom jazyku programujem. Nie som ten, kto si pozrie nejaký tutoriál. Tak ako som si v JS/TS naprogramoval reaktívne knižnice a veľa nových vecí som sa naučil pretože som narazil na problémy, na ktoré bežne nenarazíš, tak rovnako si sám pre seba programujem v PHP router a veci, ktoré nebudú dokonalé, pretože neviem daný jazyk na takej úrovni aby som myslel na výkon a pod. Ale naučím sa riešiť problémy so syntaxou nových verzií PHP. Napr. som ostal prekvapený, že v PHP sa objavili arrow functions, pekná je aj alternatíva switch - match a rovnako už spomínané atribúty, ktoré sú momentálne overkill na mňa, tak sa im ešte venovať nebudem.

Slovenský a zrejme aj český trh je stále preplnený zdieľanými hostingmi, kde nodejs neponúkajú (asi je to spôsobené technickými obmedzeniami), ale PHP je k dispozícii všade. Nutnosť využiť virtuálky kde si vie klient nahodiť a spravovať nodejs server je oveľa nižšia ako rozbehnúť niekde wordpress prípadne iné na mieru šité PHP riešenie. PHP je teda stále silne zastúpené, dokonca si dovolím povedať, že oveľa viac ako nodejs a nie je to iba z nejakého legacy dôvodu ale práve, kvôli lepšej dostupnosti (aj) pre technicky menej skúsených používateľov/developerov etc..

A mimochodom mne sa nepodarilo nájsť riešenie, ktoré by dokázalo komplexne prepojiť PHP backend s nejakým FE frameworkom. Tým mám na mysli, ako je kombinácia Next.js a React, kde je jednoduchá možnosť "zapnúť" SSR. S PHP to nejde jednoducho. Ak to neexistuje, tak je to diera na trhu a urobte to niekto, ja na to nemám PHP skill.
Kcko
Profil
weroro:
A mimochodom mne sa nepodarilo nájsť riešenie, ktoré by dokázalo komplexne prepojiť PHP backend s nejakým FE frameworkom. Tým mám na mysli, ako je kombinácia Next.js a React, kde je jednoduchá možnosť "zapnúť" SSR. S PHP to nejde jednoducho. Ak to neexistuje, tak je to diera na trhu a urobte to niekto, ja na to nemám PHP skill.

Laravel a jeho LiveWire.

Já dělám v Nette už několik let, to samé v JS (konkrétně ve Vue.js) a nenapadlo by mně "ztrácet čas" si dělat vlastní router a podobné složitosti. Vlastně mě to napadlo už pred drahnou dobou, kdy jsem ještě o Nette nevěděl, nějak to fungovalo, ale co si budeme, stálo to za ****** :)

Být Tebou raději se naučím některý fw ze zmíněné 3ky (Laravel/Symfony/Nette) než si něco bastlit, ale jestli to máš pro výuku nebo hrátky,
inu proč ne, ale nebude to stát IMHO za mnoho a stejně nakonec skončíš u FW.
weroro
Profil
Kcko:
LiveWire nie je niečo ako HTMX, resp. to s tým porovnávali? Viem, že to existuje. Ale to nie je to isté ako môcť použiť nejaký populárny js framework, ku ktorému bude možné vytvoriť SSR pomocou PHP backendu (napr. že by sa používal jednotný template, ktorý by sa servoval ako statika z PHP ale zároveň by sa aj build-il do JS).

Ty si myslíš, že napr. ak budeš vedieť React/Angular/Vue, tak vieš automaticky JS/TS? Nie. Vieš ten framework a nie jazyk na ktorom je postavený. Preto sa učím novú verziu PHP a nie novú verziu Laravelu. PHP Frameworky používam Symfony (ale ako maintainer projektov, pretože rozbehať a nastaviť Symfony je také mierne peklo). S Laravel mám min skúsenosť ale je mi veľmi sympatický Blade template engine svojou syntaxou a konečne som sa dočkal aj v Angulari direktívnej syntaxe v templatoch tak ako to má Blade. O Nette som vždy iba počul a nikdy neskúsil (tuším ma odrádzal fakt, že dokumentácia k Nette je nekompletná a na veľa miestach bolo/je iba: TODO)

Ale áno, ak by som chcel robiť nejaké väčšie riešenie na mieru, tak isto by som to nerobil na kolene, ale použil hotové odladené veci.

Toto, čo robím je vec vzdelávania sa. Učím sa (updatujem znalosti) jazyk, nie framework.

Nepýtal som sa na riešenie elementárneho problému, najprv som sa pýtal na tie atribúty resp. obdobu dekorátorov a potom bola otázka v rámci architektúry aplikácie, resp jej časti a aj to som nechcel riešenie ale iba či existuje nejaký ucelený pattern pre definíciu routes v PHP. Podlľa odpovede súdim, že neexistuje a to stačí ako odpoveď.
Kcko
Profil
weroro:
Ahoj,

LiveWire neni jako HTMX. HTMX se mi moc nelíbí. LiveWire sem viděl, když týpek propojoval Laravel a Vue.js. Autor / Spoluautor LiveWire je Caleb Porzio, který je mj. autorem reaktivní knihovny Alpine.js což je jako Vue.js v HTML. Sáhnu po ní, když dělám nějakou PHP/HTML věc mimo Vue.js a nechci to psát v čistém JS. Ne že by mi Vanila JS nějak vadil, naopak, hltám každou novou věc z ES kolekcí.

A tím tí zaroveň odpovídám, pokud umíš Vue.js, tak člověk který se ho učí, by už měl mít minimálně nějakou medior či vyšší znalost JS, jinak si neškrtne.

V ostatních věcech Ti rozumím, ale mícháš 2 věci dohromady.

To, že se učíš novou syntaxi / nově přidané věci do jakéhokoliv jazyku (PHP / JS / CSS / Whatever) to je v pořádku, dneska se to mění a vyvíjí rychle a člověk musí být neustále v obraze, jinak mu ujede vlak.

To je v pořádku a má to tak každý dnešní rozumný webdeveloper.

Ale psát si sám sofistikované věci jako je router, je trošku self-killing. Nevím co nového se na tom naučís (ze syntaxe a postupů skoro nic), akorát Ti to udělá bolehlav ( github.com/nette/application ).

Ale proti gustu ... hodně zdaru ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0