Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – 3. diel - Smerovač (router)

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Matěj Přerovský:17.2.2020 12:41

Ahoj,
už druhý den řeším jeden problém.

<?php
// Nastavení interního kódování pro funkce pro práci s řetězci
mb_internal_encoding("UTF-8");
// Callback pro automatické načítání tříd controllerů a modelů
function autoloadFunkce($trida)
{
        // Končí název třídy řetězcem "Kontroler"
    if (preg_match('/Kontroler$/', $trida))
        require("kontrolery/" . $trida . ".php");
    else
        require("modely/" . $trida . ".php");
}

spl_autoload_register("autoloadFunkce");

// Vytvoření routeru a zpracování parametrů od uživatele z URL
$smerovac = new SmerovacKontroler();
$smerovac->zpracuj(array($_SERVER['REQUEST_URI']));

echo("Pokus");

Když zakomentuju

$smerovac = new SmerovacKontroler();
$smerovac->zpracuj(array($_SERVER['REQUEST_URI']));

, tak to správně vypíše Pokus.

Jinak tam je jen bílá plocha.

Mám PHP 7.3.12 a je to na Endoře.

Veškerý kód jsem si nakonec zkopíroval, ale stejně to nefunguje.

Pomůžete mi prosím?

Editované 17.2.2020 12:42
Odpovedať
17.2.2020 12:41
42
Avatar
Milan Turyna
Tvůrce
Avatar
Odpovedá na Matěj Přerovský
Milan Turyna:17.2.2020 14:01

Nevím jak je to s tímhle návodem, nečetl jsem ho, ale možná když půjdeš na další lekci tam se podíváš jak to propojit a napíšeš pokus do pohledu tak by to mohlo jít.

Odpovedať
17.2.2020 14:01
Řeš pouze to, co dokážeš ovlivnit.
Avatar
Stepan
Člen
Avatar
Stepan:23.7.2020 14:04

Ahoj, řeším jeden problém, kde a jak vyřeším, mám-li v xamppu projekt v podsložce např: localhost/mvc/­......
Pokaždé mě to přesměruje na chyba stylu localhost/chyba - nenajde mi třídu .
Nechal jsem si vypsat co jde do $tridaKontroleru a tam mám právě podložku MVC a není v ní žádný kontroler.
Dám-li projekt do hlavní složky, vše funguje.
Nertuší někdo jak tuto věc vyřešit?

 
Odpovedať
23.7.2020 14:04
Avatar
jozef.stropko:24.7.2020 11:47

Stepan, neviem, či Ti poradím. Ja nemám projekt v koreňovej zložke htdocs, ale v podzložke cms01. Pri zadaní echo($triedaKon­troleru); vo funkcíí spracuj(), ktorá je v SmerovacKontroler-i na stránke sa vypíše Cms01Kontroler. Akurát som zmenil v premennej $triedaKontroleru vo funkcii spracuj() array_shift($na­parsovanaURL) na $naparsovanaURL[1], keďže predpokladám, že array_shift vyberie z poľa prvý index (t.j. nultý), čo je podzložka cms01 a index [1] je už názov požadovanej zložky čo je clanok ([0] - cms01 [1] - clanok)

Netvrdím, že moje riešenie je správne, snažím sa pochopiť MVC a osobne som si projekt založil v podzložke a nie v koreňovej zložke htdocs, keďže tam mám mnoho či už projektov, alebo učebných súborov a kvôli mvc, ktoré by bolo v htdocs to nechcem dávať všetko preč.

 
Odpovedať
24.7.2020 11:47
Avatar
jozef.stropko:24.7.2020 11:49

Aby som upresnil adresa u mňa je v podzložke localhost/cms01

 
Odpovedať
24.7.2020 11:49
Avatar
Marcel Sup
Člen
Avatar
Odpovedá na jozef.stropko
Marcel Sup:16.8.2021 11:39

Já také jsem si vložil projekt do podsložky (RS) a řešil jsem funkční zprovoznění. Myslím, že se mi to podařilo vytvořením konstanty, která se skládá z názvu podsložky opatřenou po obou stranách lomítky v abstraktní třídě Kontroler. Je potřeba předsadit tuto konstantu ve funkci presmeruj (v abstr.třídě Kontroler) před url adresu při přesměrování.Dále je potřeba místo pouhého lomítka vytrimovat z výrazu ve třídě SmerovacKontroler právě tuto konstatntu.

abstract class Kontroler {

    protected $data = array();
    protected $pohled = "";
    protected $hlavicka = array('titulek' => '', 'klicova_slova' => '', 'popis' => '');

    const ABSOLUTE_PATH = "/RS/";

    abstract function zpracuj($parametry);

    public function vypisPohled() {
        if ($this->pohled) {
            extract($this->data);
            require("pohledy/" . $this->pohled . ".phtml");
        }
    }

    public function presmeruj($url) {
        header("Location: " . self::ABSOLUTE_PATH . $url );
        header("Connection: close");
        exit;
    }

}
 private function parsujURL($url) {
        $naparsovanaURL = parse_url($url);
        $naparsovanaURL["path"] = ltrim($naparsovanaURL["path"], Kontroler::ABSOLUTE_PATH );
        $naparsovanaURL["path"] = trim($naparsovanaURL["path"]);
        $rozdelenaCesta = explode("/", $naparsovanaURL["path"]);
        return $rozdelenaCesta;
 
Odpovedať
16.8.2021 11:39
Avatar
Jirka
Člen
Avatar
Jirka:21.2.2022 18:57

Nepoužívám subdomény pro localhost a mám v jedné složce více projektů atd.
Upravil jsem tedy parametry pro směrovač takto:

$url_web = "/test/web";
$url_web = str_replace("$url_web", "", $_SERVER['REQUEST_URI']);
$smerovac = new SmerovacKontroler();
$smerovac->zpracuj(array($url_web));

Funguje mi to stejně, pokud mám například localhost/tes­t/web/clanek/na­zev-clanku/dalsi-parametr.
Může to mít nějaký negativní vliv na další lekce, nebo fungování projektu?

 
Odpovedať
21.2.2022 18:57
Avatar
Ondřej Nyklíček:28.11.2022 19:53

Také jsem to řešil. Jelikož mi přišlo velice nepraktické použít konstantu, přemýšlel jsem nad jiným způsobem.

private function parseURL(string $url) : array
    {
        $uri = substr($url, strlen($this->getBasePath()));

        if (strstr($uri, '?')) {
            $uri = substr($uri, 0, strpos($uri, '?'));
        }

        $parsedUrl = parse_url($uri);
        $parsedUrl["path"] = ltrim($parsedUrl["path"], "/");
        $parsedUrl["path"] = trim($parsedUrl["path"]);
        $finalUrl = explode("/", $parsedUrl["path"]);

        return $finalUrl;
    }

    /**
     * @return string
     */
    public function getBasePath()
    {
        // Check if server base path is defined, if not define it.
        if ($this->serverBasePath === null) {
            $this->serverBasePath = implode('/', array_slice(explode('/', $_SERVER['SCRIPT_NAME']), 0, -1)) . '/';
        }

        return $this->serverBasePath;
    }
 
Odpovedať
28.11.2022 19:53
Avatar
Jan Muzikar
Člen
Avatar
Jan Muzikar:10.11.2024 9:35

Ahoj Davide, nedaří se mi zprovoznit prostředí pro "hezké adresy", poradíš? Mám Ubuntu 22.04, zprovoznil jsem pro tento kurz virtual host "mvc" (server name mvc, document root /var/www/mvc/­public_html). Soubor .htaccess je vytvořený podle návodu a ve složce /var/www/mvc i ve složce /var/www/mvc/­public_html. index.php a podsložky jsou v adresáři /var/www/mvc/­public_html. Už jsem vyzkoušel mnohé podle různých diskuzních fór, ale stále dostávám od serveru 404 Not Found. Díky, Honza

 
Odpovedať
10.11.2024 9:35
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 9 správy z 109.