shortURL ověření zadané url

mimacala
Člen | 113
+
0
-

Ahojte, jdu si pro radu.

Prosím pokud mám aplikaci která má v db krátké url a k nim přiřazené dlouhé.
Jak by šlo vyřešit odchytávání a přesměrování aniž by mi to vyhodilo error 404?
Odchytávat nějak url na startup presenteru ?

Chci říct pokud si někdo vytvořil krátkou url www.test.cz/123456 a moje odména je www.test.cz.
Jak zajistit, aby to daného člověka přesměrovalo dle databáze a nehodilo mu to chybu s neexistující stránkou ?

Chtěl bych zachovat čistou url domény a nevolat na další presenter, který ho přesměruje www.test.cz/redirect?….

Moc děkuji

jeremy
Člen | 50
+
+1
-

Mozna by to slo pres router:

...

$router->withPath('s')
	->addRoute('<slug .+>', ['presenter' => 'ShortUrl', 'action' => 'default')
	->end();

...

Pak bys mel url www.test.cz/s/123456 kde „123456“ je hodnota parameteru <slug> podle ktery v databazi najdes dlouhou url a presmerujes.

Presmerovani bys mohl udelat ve startupu nebo actionDefault v ShortUrl presenteru.

Omlouvam se, ze nemam diakritiku, ale jiz leta nepouzivam ceskou klavesnici.

Editoval jeremy (19. 6. 2023 15:50)

mimacala
Člen | 113
+
0
-

Aha to zní dobře, umístím routu a zítra zkusím.
Moc děkuji, routám jsem se nikdy moc nevěnoval až teď, když to byla potřeba :D

Palec+

m.brecher
Generous Backer | 761
+
+1
-

@mimacala

Řešil bych to jednoduše přesměrováním v akci presenteru. Pokud je dlouhé url v databázi ve sloupci slug a krátké url ve sloupci short_slug a jsou obě url umístěné na společné cestě v routeru tak nějak takhle.

presenter:

class ArticlePresenter extends BasePresenter
{
    public function __construct(
        private ArticleModel       $articleModel,
    )
    {}

    public function actionView(string $slug)
    {
        $article = $this->articleModel->getOne($slug);  // get by slug
        if(!$article){
            $article = $this->articleModel->getOne($slug, byShortSlug: true);  // get by short slug
            if($article){
                $this->redirect('this', ['slug' => $article->slug]);

            }else{
                 $this->error('404');
            }
        }
    // zde zpracujeme $article
    }
}

model:


class ArticleModel
{
    public function __construct(private Explorer $database)
    {}

    public function getOne(string $slug, bool $byShortSlug = false): ActiveRow|null
    {
        $searchColumn = $byShortSlug ? 'short_slug' : 'slug';
        return $this->database->table('article')->where($searchColumn, $slug)->fetch();
    }
}

router:

$router->addRoute('path/<slug>', 'Article:view');
mimacala
Člen | 113
+
0
-

Moc děkuji,
vše funguje jak má :))