IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: RouterFactory vygenerovaný za pomocí PhpGenerator vaše názory?

Aktivity
Avatar
Jan Sagi
Člen
Avatar
Jan Sagi:16.10.2021 10:50

Dobrý den jsem opravdu začátečník :-) přemýšlel jsem ze bych chtěl v administraci webu editovat URL adresy přes nějaký formulář kde budu mít uložené URL adresy v databázi tak jsem se nejprve uvažoval že použiju funkci router IN a OUT.
Ale pak mně napadlo že možná bude lepší vygenerovat RouterFactory.php a nezatěžovat databázi...
Jaký je váš názor napsal jsem jen takovou základní třidu jestli to bude fungovat do dokonalosti má zatím daleko :-)

<?php

namespace App\RouterModule\Model;

use App\RouterModule\Model\RouterDb;
use Nette\Utils\FileSystem;
use Nette\PhpGenerator\ClassType;
use Nette\PhpGenerator\Printer;


class RouterGenerator
{
    private string $textTop = "
       \n declare(strict_types=1);
       \n namespace App\RouterModule\Model;
       \n  use Nette;
       \n  use Nette\Application\Routers\Route;
       \n  use Nette\Application\Routers\RouteList;\n\n\n";

    private RouterDb $db;

    public function __construct(RouterDb $db)
    {
        $this->db = $db;
    }

    public function create(): string
    {
        $class = new ClassType('RouterFactory');

                 $class->addMethod('createRouter')
                     ->setStatic()
                     ->setReturnType('RouteList')
                     ->setVisibility('public')
                     ->setBody($this->createBody());




        $class = $this->textTop. $class;

        FileSystem::write(__DIR__ . '/RouterFactory.php','<?php' . $class);
        return $class;
    }


    private function createBody():string
    {
        $routerData = $this->db->routerList();

        $code = '$router = new RouteList;' . "\n\n";

        foreach ($routerData as $route)
        {
            $code .= '$router->'."addRoute('{$route->full_url}', '{$route->module}:{$route->presenter}:{$route->action}');";

            $code .= "\n";

        }

        return $code . "\n" . 'return $router;';
    }

}

A výsledek vypadá takto

<?php

 declare(strict_types=1);

 namespace App\RouterModule\Model;

  use Nette;

  use Nette\Application\Routers\Route;

  use Nette\Application\Routers\RouteList;


class RouterFactory
{
        public static function createRouter(): RouteList
        {
                $router = new RouteList;

                $router->addRoute('admin/router', 'Router:Router:default');
                $router->addRoute('', 'Home:Home:default');

                return $router;
        }
}
Editováno 16.10.2021 10:52
 
Odpovědět
16.10.2021 10:50
Avatar
Odpovídá na Jan Sagi
Patrik Valkovič:16.10.2021 12:36

Můžeš mít jako poslední routu v aplikaci typu catch-all (pokud nebude možné použít jinou routu) a v ní se rozhodovat, který článek načíst. Přegenerovávat si aplikaci pod rukama rozhodně není top řešení, i když asi bude fungovat (naštěstí pro PHP, nikde jinde by to nefungovalo). Otázka jestli chceš editovat URL celého webu, nebo třeba jen článků, apod.

Nahoru Odpovědět
16.10.2021 12:36
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jan Sagi
Člen
Avatar
Odpovídá na Patrik Valkovič
Jan Sagi:16.10.2021 15:13

Myšlenka byla úplně všechny URL adresy spíše jsem byl zvědaví jestli podobné řešeni už někoho napadlo... :-)
Napadlo mně to ránu u hlídání děti tak jsem to za 20min nějak ze smolil :-?
Samozřejmě by se RouterFactory.php vygeneroval jen po odesláni nějakého formuláře.

 
Nahoru Odpovědět
16.10.2021 15:13
Avatar
Odpovídá na Jan Sagi
Patrik Valkovič:16.10.2021 16:40

Jako fungoivat to bude, ale je to dost nebezpečné. Znovu říkám, přepisuješ si aplikaci pod rukama. Co když tam dá někdo nějaký nebezpečný vstup nebo něco podobného?
A otázka proč bys chtěl vůbec něco takového dělat? Většinu se to dělá například pro /clanek/nazev-clanku, to jde podchytit v klasických routách. Proč bys chtěl měnit úplně všechny routy, i ty které jsou statické? To prostě nedává smysl.

Nahoru Odpovědět
16.10.2021 16:40
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.