• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP MVC pomoc przy widokach

Object Storage Arubacloud
+2 głosów
380 wizyt
pytanie zadane 25 stycznia 2018 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)

Witam

Uczę się MVC mam napisany router i teraz przyszedł czas na widok i controller, wiem że na początku musiałbym napisać coś w tym controllerze ale na razie chciałbym uzyskać odpowiedz na pytanie, więc tak mam zmienną $this->test= 'abc', dołączam widok ale w tym widoku nie mogę się odwołać do zmiennej.

class Router
{
    private $router;
    private $controller;

    public function __construct()
    {
        $this->router = strtolower($_GET['router']);
        $this->router = rtrim($this->router, "/");
        $this->router = explode("/", $this->router);

        $this->controller = ucfirst($this->router[0]);

        if($this->controller === "Index.php") {
            $this->controller = "Index";
        }

        $file = 'controller/'.$this->controller.'.php';

        if(file_exists($file)) {
            require_once($file);
            $openClass = new $this->controller($this->router);
        } else {
            echo "Nie można wczytać ścieżki do pliku";
        }
    }
}
class Controller
{
    protected $view;

    public function __construct()
    {
        $this->view = new View();
    }
}
class View
{
    public function render(string $path = null, string $name)
    {
        if($path) {
            require_once('view/' . $path . '/' . $name . '.php');
        } else {
            require_once('view/'. $name . '.php');
        }
    }
}
class Index extends Controller
{
    public $test;

    public function __construct($action)
    {
        parent::__construct();

        echo $action[1];

        $this->test = 'a';

        $this->view->render("test", "test");
    }
}
<html>
<head>
    <title>Test</title>
</head>
<body>
    <h2><?php echo $this->test; ?></h2>
</body>
</html>

 

błąd to Notice: Undefined property: View::$test in D:\XAMPP\htdocs\Testy\MVC\view\test\test.php on line 6

komentarz 19 marca 2018 przez Artek Stary wyjadacz (11,800 p.)
A czemu bez autoloader'a?
komentarz 19 marca 2018 przez `Krzychuu Stary wyjadacz (13,940 p.)
To był dopiero mój początek i testowałem

3 odpowiedzi

+2 głosów
odpowiedź 26 stycznia 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
Widzę, że nie używasz composera a by było warto jak już zaczynasz używać wzorca MVC. Zawsze łatwiej się operuje przestrzeniach nazw i nie musisz szukać plików i wtedy szukasz np. kontrolera w przestrzeni nazw kontrolerów, dodatkowo przez composera możesz sobie zainstalować np. TWIG-a to jest silnik szablonów to Ci łatwiej pozwoli zarządzać wyświetlaniem danych w widokach.

Także ustaw sobie jako klasę abstrakcyjną klasę Controller, wszystkie kontrolery powinny dziedziczyć po tej klasy.
komentarz 26 stycznia 2018 przez `Krzychuu Stary wyjadacz (13,940 p.)
Na razie nie chce zbytnio sobie mieszać composerem, chce najpierw zobaczyć jak działa sam MVC, ale dziękuję za pomoc jak już ogarnę sam MVC to chętnie skorzystam z composera, mógłbyś zobaczyć na kod czy jest dobry ?
2
komentarz 26 stycznia 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)

Dodatkowo będziesz miał problem z routerem na systemach unixowych bo tam jest rozróżniana wielkość liter. I plik i Plik to różne pliki. Jeżeli będziesz pobierał nazwę pliku z adresu URL a nazwę pliku będziesz miał np: AccountController. To już akcja się Ci nie wywoła.
Dodatkowo, jeżeli nazywasz kontrolery to rób to tak
IndexController a nie samo Index. To jest dobra praktyka.

A widoki przechowujesz wtedy w folderach TwojeWidoki/NazwaKontrolera/NazwaAkcji.html

to też jest dobra praktyka.
Dodatkowo, też bym używał stałem __DIR__ do podawania ścieżki do plików. Np. w klasie View zrób tak:
 

require_once(__DIR__ '/view/' .  $name . '.php');

Wtedy masz bezwzględną lokalizacje pliku i nie będziesz miał problemu jeżeli będziesz przenosił aplikację na serwer.

komentarz 26 stycznia 2018 przez `Krzychuu Stary wyjadacz (13,940 p.)
edycja 26 stycznia 2018 przez `Krzychuu
Dzięki za wskazówki, co do wielkości liter to mam dodane żeby zawsze zmieniał duże litery na małe i przy kontrolerze jest żeby zawsze pierwsza litera była duża, takie zabezpieczenie starczy?

Edit: gdy dodałem __DIR__ wystąpił błąd ponieważ plik View.php mam w folderze core i gdy wywołuje echo __DIR__ w view/test/test.php to wyskakuje taka ścieżka

D:\XAMPP\MVC/core/view/test/test.php a powinno być D:\XAMPP\MVC/view/test/test.php
komentarz 26 stycznia 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)

Wtedy cofasz się w folder w górę używając " .. "

require_once(__DIR__ '../view/' .  $name . '.php');

 

komentarz 26 stycznia 2018 przez `Krzychuu Stary wyjadacz (13,940 p.)
próbowałem już tak wyskakuje:

D:\XAMPP\htdocs\Testy\MVC\core../view/test/test.php
komentarz 26 stycznia 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
To jeszcze raz musisz się cofnąć... xD
komentarz 26 stycznia 2018 przez `Krzychuu Stary wyjadacz (13,940 p.)
dziękuje za pomoc, a co z wielkością liter dobrze rozwiązałem ten problem?
+1 głos
odpowiedź 25 stycznia 2018 przez CzikaCarry Szeryf (75,340 p.)
Zmienną test (w twoim kodzie) jest w kontrolerze a nie w widoku.
komentarz 25 stycznia 2018 przez `Krzychuu Stary wyjadacz (13,940 p.)
Właśnie nie wiem w jaki sposób wyświetlić tą zmienną w dołączanym pliku
komentarz 25 stycznia 2018 przez CzikaCarry Szeryf (75,340 p.)

Musisz wstrzyknąć tą wiadomość do widoku. Do metody render dodaj jeszcze jeden parametr, który będzie np. tablicą, do której będziesz wrzucać dane, obiekty itd :)

Ewentualnie(nie polecam tego rozwiązania bo łamie zasady MVC, męci w kodzie i w ogóle) możesz w klasie Router stworzyć pole o nazwie np. controllerInstance i linijkę:

$openClass = new $this->controller($this->router);

Zmienić na:

$this->controllerInstance = new $this->controller($this->router);

Wtedy w pliku index.php (czy jak tam się zwie twój plik do którego idzie cały traffic strony) tworzysz globalnie obiekt routera i w zależności od jego nazwy możesz w widoku tego używać:

echo $objName->controllerInstance->test;

Ogólnie to rozwiązanie to czysta Albertowizna (bez urazy dla żadnego Alberta), i w sumie nie wiem po co to pokazywałem.

Życzę owocnej nauki :)

komentarz 26 stycznia 2018 przez `Krzychuu Stary wyjadacz (13,940 p.)
edycja 26 stycznia 2018 przez `Krzychuu
Ogólnie jak zrobiłem w klasie Index $this->view->test = "abc"; to się ładnie wyświetliło, tylko nie wiem czy tak można zrobić, może lepiej byłoby zrobić nową metodę w klasie view- która będzie trzymała parametry co będzie lepsze ?

 

PS. Mógłbyś ocenić router czy jest w porządku ?
+1 głos
odpowiedź 19 marca 2018 przez Artek Stary wyjadacz (11,800 p.)
Twój kod mi pomógł w obczajeniu szczegółów tego zagadnienia

Podobne pytania

+5 głosów
3 odpowiedzi 1,242 wizyt
pytanie zadane 1 lipca 2015 w PHP przez Hatter Gaduła (3,180 p.)
0 głosów
0 odpowiedzi 230 wizyt
pytanie zadane 4 grudnia 2020 w C# przez dz3101 Nowicjusz (220 p.)
0 głosów
1 odpowiedź 315 wizyt
pytanie zadane 1 października 2018 w Java przez must Bywalec (2,980 p.)

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...