Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Libor 20. 03. 2017, 19:31:49

Název: Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Libor 20. 03. 2017, 19:31:49
Ahoj chlapy, potřeboval bych poradit s částí kódu v PHP.
v proměnné $_GET['url'] mám uloženou vždy celou url

echo $_GET['url'];
vypíše
/katalog/priroda-cr/voda-sladka/ryby-male

a potřebuji z této url vytvořit nový objekt třídy včetně namespace
$obj = new \Controls\Katalog\PrirodaCr\VodaSladka\RybyMale ();

Pokud třída neexistuje zavolat
$obj = new \Controls\Error404 ();

Poradil by mi prosím někdo jak to jednoduše udělat? Předem děkuji za pomoc.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Kit 20. 03. 2017, 20:11:50
Rozparsuj si to URL po lomítkách, slož ho podle potřeby do proměnné třeba $class a pak už jen zavolej
Kód: [Vybrat]
$obj = new $class();Hoď si to do bloku try .. catch. Při výjimce si ji zachyť a vyhoď 404.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: to_je_jedno 20. 03. 2017, 20:46:31
Nicmoc reseni kite, obcas dokazes predvest vic.

Podivej se napr na http://symfony.com/doc/current/routing.html
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: 3ugeene 20. 03. 2017, 21:02:40
preg_match_all a regex /\/(\w*(-\w*)?)*/ by te alespon trochu mohl nasmerovat
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: 3ugeene 20. 03. 2017, 21:05:36
prevod na camelcase mozna timhle?


Kód: [Vybrat]
$output = preg_replace_callback('/-(.?)/', function($m) {
     return ucfirst($m[1]);
}, $input);
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: 3ugeene 20. 03. 2017, 21:14:25
ted premejslim, ze to vlastne cely jde udelat vicemene jednim regexem, ale jsem linej si s tim hrat, doporucuji:


http://www.phpliveregex.com/
 (http://www.phpliveregex.com/)
http://preg_replace_callback.onlinephpfunctions.com/ (http://preg_replace_callback.onlinephpfunctions.com/)
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Kit 20. 03. 2017, 22:04:14
Podivej se napr na http://symfony.com/doc/current/routing.html

To má být vtip? Kvůli šesti řádkům instalovat Symfony?
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Tuxik 21. 03. 2017, 12:04:52
Podivej se napr na http://symfony.com/doc/current/routing.html

To má být vtip? Kvůli šesti řádkům instalovat Symfony?
Welcome to the real world Neo. A za chvíli mu někdo poradí, ať to přepíše do javy :D
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: 3ugeene 21. 03. 2017, 12:22:59
No, navrhnout Symfony (nebo jiny framework) je (asspon podle mych zkusenosti) nahodou docela dobrej napad. Protoze jinak si uzivatel udela skvely reseni po svym, vubec nepocita s tim, ze by tam mohla bejt bezpecnosti dira (protoze to PHPcko dneska prece umi kazdej, ne?) a pak se divi, kam zmizely ze serveru vsechny jeho data.


-- true story --
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Tuxik 21. 03. 2017, 12:55:55
No, navrhnout Symfony (nebo jiny framework) je (asspon podle mych zkusenosti) nahodou docela dobrej napad. Protoze jinak si uzivatel udela skvely reseni po svym, vubec nepocita s tim, ze by tam mohla bejt bezpecnosti dira (protoze to PHPcko dneska prece umi kazdej, ne?) a pak se divi, kam zmizely ze serveru vsechny jeho data.


-- true story --
Ano... a jsme opět u toho, jako vždy... HW je skoro zadarmo, zato člověk, kterej si dneska bez nějakýho FW ani neprdne a vlastně nemá ani páru, co a proč dělá, tak stojí ranec. Smutné, smutné, smutné. Ještě před pár roky by takoví lidi skončili na pokladně v supermarketu, protože na víc vlastně stejně nemají a současné IT je degradované na stejnou úroveň, jenom platy jsou vyšší, protože je lidí málo (je jich dost, jenom uklízečka si většinou ani nedovolí přemýšlet nad tím, že by šla programovat, i když na to většinou v pohodě má). Až doroste současná mladá generace, která v tom vyrůstá, platy pokladních budou vyšší, než "programátorů", protože těch budou plný pracáky. Výjimkou budou právě ti vývojáři frameworků a jazyků, protože to bude jediná opravdu kvalifikovaná práce, všichni javameni a spol se přesunou do kategorie lopata za 20k.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Kit 21. 03. 2017, 16:29:48
No, navrhnout Symfony (nebo jiny framework) je (asspon podle mych zkusenosti) nahodou docela dobrej napad. Protoze jinak si uzivatel udela skvely reseni po svym, vubec nepocita s tim, ze by tam mohla bejt bezpecnosti dira (protoze to PHPcko dneska prece umi kazdej, ne?) a pak se divi, kam zmizely ze serveru vsechny jeho data.

Zrovna v Doctrine jsem nedávno našel odkaz na jednu z mnoha vlastností, která však nebyla zdokumentována a ani Google neporadil, co mělo být jako volitelný čtvrtý parametr jedné z mnoha metod. Takže i slavné frameworky docela kulhají.

Ty bezpečnostní díry se i s frameworkem dají udělat docela snadno.

Celé se to točí kolem toho, že framework zpracovává nějaký doménově specifický jazyk. Čím víc toho ten framework umí, tím méně se stává doménově specifickým a tím víc je běžným jazykem interpretovaným uvnitř jiného interpretru. Stává se tak zbytečnou mezivrstvou s chabou dokumentací a nevyzpytatelným chováním.

Z toho vyplývá, že smysl mají pouze frameworky, které toho moc neumí, ale to co umí, umí dokonale. Obvykle už v PHP jsou ve formě standardních knihoven.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Ivan Nový 21. 03. 2017, 17:01:11
No, navrhnout Symfony (nebo jiny framework) je (asspon podle mych zkusenosti) nahodou docela dobrej napad. Protoze jinak si uzivatel udela skvely reseni po svym, vubec nepocita s tim, ze by tam mohla bejt bezpecnosti dira (protoze to PHPcko dneska prece umi kazdej, ne?) a pak se divi, kam zmizely ze serveru vsechny jeho data.

Zrovna v Doctrine jsem nedávno našel odkaz na jednu z mnoha vlastností, která však nebyla zdokumentována a ani Google neporadil, co mělo být jako volitelný čtvrtý parametr jedné z mnoha metod. Takže i slavné frameworky docela kulhají.

Ty bezpečnostní díry se i s frameworkem dají udělat docela snadno.

Celé se to točí kolem toho, že framework zpracovává nějaký doménově specifický jazyk. Čím víc toho ten framework umí, tím méně se stává doménově specifickým a tím víc je běžným jazykem interpretovaným uvnitř jiného interpretru. Stává se tak zbytečnou mezivrstvou s chabou dokumentací a nevyzpytatelným chováním.

Z toho vyplývá, že smysl mají pouze frameworky, které toho moc neumí, ale to co umí, umí dokonale. Obvykle už v PHP jsou ve formě standardních knihoven.

Úkolem frameworku není něco umět, ale standardizovat to, jak se co dělá.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Tuxik 21. 03. 2017, 19:11:16
Úkolem frameworku není něco umět, ale standardizovat to, jak se co dělá.
Kéž by... úkolem frameworku je často udělat prasárny za vývojáře a daný jazyk přiohnout nějakým směrem, takže věci, za který by se příčetný, průměrně inteligentní jedinec styděl, jsou najednou v pořádku, protože je udělal někdo jinej a schoval je do FW.
Zcela proti tvým představám většina frameworků rozbíjí standardy daného jazyka a snaží se do nich zavést kraviny, často po vzoru jiného jazyka. Jak psal Kit, je to velmi často zbytečná mezivrstva, která sice může vyřešit konkrétní problém "bez práce", ale často za cenu toho, že se používají vlastnosti frameworku optimalizované pro nějakou situaci i tam, kde se vůbec nehodí a lze je řešit velmi elegantně a efektivně v původním jazyce.

Když jsme u toho, Kit respect, protože je to jeden z mála lidí, kteří se nestydí za PHP a jeho rady evidentně pocházejí z praxe a mají hlavu a patu.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Kit 21. 03. 2017, 20:13:32
Úkolem frameworku není něco umět, ale standardizovat to, jak se co dělá.

Tak standardizovat? Podívej se do libovolného frameworku, jak ignoruje návrhové vzory a porušuje všechny možné principy OOP. Od takových tvůrců si nenechám diktovat, jak mám programovat.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Kit 21. 03. 2017, 20:26:17
... Jak psal Kit, je to velmi často zbytečná mezivrstva, která sice může vyřešit konkrétní problém "bez práce", ale často za cenu toho, že se používají vlastnosti frameworku optimalizované pro nějakou situaci i tam, kde se vůbec nehodí a lze je řešit velmi elegantně a efektivně v původním jazyce.

Když jsme u toho, Kit respect, protože je to jeden z mála lidí, kteří se nestydí za PHP a jeho rady evidentně pocházejí z praxe a mají hlavu a patu.

Tragické na těch frameworcích bývá i chybně navržené a mizerně zdokumentované rozhraní. Zrovna dnes jsme narazili na záludnost jednoho z populárních frameworků, který se při běžné konfiguraci chová podivně a v rozporu s dokumentací.

Ano, dělám v PHP a nestydím se za to. Je moderním multiparadigmatickým jazykem. Je však u něj velmi důležité dodržovat jistou programátorskou kulturu, aby ten program mohl číst nejen počítač, ale i člověk. K tomu mi dopomáhej SOLID.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Ivan Nový 22. 03. 2017, 07:40:50
Filozofie PHP byla vždy taková, že nasával módní trendy z jiných jazyků. Vždyť je to vidět i v pojmenování objektů standardních knihoven, když byla módní Java, nasával prvky Javy, když byl módní Python, nasával prvky Pythonu. Je tedy logické, že ve frameworcích nasává jiné módní věci.

Jinak příklad z úvodní otázky se dá řešit v PHP i takto funkcionálně:

Kód: [Vybrat]
implode('\', array_map('ucfirst', explode('/', implode('', array_map('ucfirst', explode('-', $url))))).'()'
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Ivan Nový 22. 03. 2017, 08:11:30
A nebo taky tak, což bude asi rychlejší:

Kód: [Vybrat]
str_replace('/', '\\', str_replace('-', '', ucwords($url, '/-'))).'()'
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Ivan Nový 22. 03. 2017, 08:21:49
A nebo taky tak:

Kód: [Vybrat]
strtr(ucwords($url, '/-'), array('/' => '\\', '-' => '')).'()'
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Kamil Podlešák 22. 03. 2017, 08:45:47
Z toho vyplývá, že smysl mají pouze frameworky, které toho moc neumí, ale to co umí, umí dokonale. Obvykle už v PHP jsou ve formě standardních knihoven.
První věta OK, pes je zakopaný v druhé větě: standardní knihovna PHP je strašný šmejd. Takže každý vývojář který v tom má dělat něco většího má dvě možnosti: buďto použije nějaký framework, nebo si napíše vlastní. Oboje má svoje velké nevýhody.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Ivan Nový 22. 03. 2017, 08:59:25
Z toho vyplývá, že smysl mají pouze frameworky, které toho moc neumí, ale to co umí, umí dokonale. Obvykle už v PHP jsou ve formě standardních knihoven.
První věta OK, pes je zakopaný v druhé větě: standardní knihovna PHP je strašný šmejd. Takže každý vývojář který v tom má dělat něco většího má dvě možnosti: buďto použije nějaký framework, nebo si napíše vlastní. Oboje má svoje velké nevýhody.

U frameworků není podstatné, zda to dělají dobře a nebo špatně, ale že to lidé, kteří je používají, dělají stejně blbě, nebo dobře, tedy vypočitatelně. Což je obvyklá výhoda neformální kontextové standardizace.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Ivan Nový 22. 03. 2017, 09:04:15
Hezkým příkladem té standardizace je Odoo, který to přivedl k dokonalosti, kde minimálními prostředky vyjádříte maximum, dokonce do rozumné úrovně standardizuje postupy používané na serveru v Pythonu a v prohlížeči v Javascriptu.
Název: Re:Jak zavolat třídu v PHP podle zadané url
Přispěvatel: Kit 22. 03. 2017, 12:12:13
A nebo taky tak, což bude asi rychlejší:
Kód: [Vybrat]
str_replace('/', '\\', str_replace('-', '', ucwords($url, '/-'))).'()'

A nebo taky tak:
Kód: [Vybrat]
strtr(ucwords($url, '/-'), array('/' => '\\', '-' => '')).'()'

Což o to, rychlejší to asi bude, ale obvykle je nutné udělat ještě nějaké další úpravy - minimálně přidat vendora, vyfiltrovat slova začínající tečkou, ...

V obou uvedených případech bych to rozepsal minimálně na dva řádky kvůli snazšímu udržování kódu.