shortURL ověření zadané url
- mimacala
- Člen | 113
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 | 54
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)
- m.brecher
- Generous Backer | 873
@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');