Zmienne przy routingu

0

Cześć, jakiś czas temu zacząłem się bawić z routingiem, ale nie chcę zrobić sobie złych nawyków ani tym bardziej złego kodu. Będę bardzo wdzięczny jeśli rzucicie na to okiem i powiecie czy można tak robić i czy jest to dobre rozwiązanie. Jeśli nie to proszę o sugestię co zmienić/co i jak zrobić.

Otóż korzystam z AltoRouter. Mój kod wygląda tak:

// Router
$router = new altoRouter();
$view = new view($account, $profile);
 
$router->map('GET', '/', function() use($view){
	$view->render('homepage', 'Panel');
});

Stworzyłem obiekt z metodą render, aby nie includować po stokroć plików header oraz footer. Pierwszy string w powyższym kodzie to nazwa pliku jaki ma zostać wczytany, a drugi to tytuł strony. Natomiast klasa wygląda tak:

class view{
		public function __construct($account, $profile){
			$this->account = $account;
			$this->profile = $profile;
		}
		public function render($page_name, $page_title){
			$this->account->isLogged();
			global $db;
			if(is_readable('views/panel/templates/header.php')){
				require 'views/panel/templates/header.php';
			}
			if(is_readable('views/panel/'.$page_name.'.php')){
				require 'views/panel/'.$page_name.'.php';
			}
			if(is_readable('views/panel/templates/footer.php')){
				require 'views/panel/templates/footer.php';
			}
		}
	}

W docelowej stronie (homepage.php), chcąc uzyskać dostęp do jakiejś zmiennej, muszę wcześniej przekazać ją do metody. I na końcowej stronie wyświetlam ją poprzez $this-> moja zmienna/metoda. Czy to jest dobry sposób czy macie jakieś lepsze rozwiązania? Bo przyznam, że wydaje mi się to dziwne, że muszę przekazywać dużo zmiennych do konstruktora klasy view (w przykładzie ich nie ma, ale w skrypcie to m.in zmienna z bazą danych, kontem, profilem i jeszcze parę innych, które akurat na tej stronie są mi potrzebne)

0

po to między innymi wynaleziono obiekty

0

Siema @LukiPuki,
dzięki, że podzieliłeś się kodem...

Sam teraz walczę z routing'iem koncepcyjnie,
do mojego pierwszego kodu, którym chciałbym się podzielić ze społecznością :-)

Pozwolę się podzielić moimi uwagami:

  • użycie global $db; w przyszłości utrudni testy.
  • może kojarzysz wzorzec MVC. Fajnie, że starasz się stosować dobre praktyki
  • jeśli interesują Cie dobre nawyki rzuć okiem na PSR-2 i PSR-4
  • nie chce wchodzić w logikę Twojego kodu, ale chyba masz za dużo kodu w szablonie ( np. w pliku header.php ) .
    W dobrych praktykach powtarzają, że php powinien być tylko gościem w widoku.
  • może zainteresuje Cię headers() i ob_start()/ob_end_flush();
  • no i brakuje else dla $page_name (404 ?)

Pozdrawiam

1
Dla potomnych, choć pewnie raczej jakiś algorytm to zindeksuje i zniknie:

@LukiPuki z rozmowy prv.
edytowałem i usunąłem prywate

global $db dałem tam chwilowo (tak wiem, nie powinno robić rzeczy na chwilę, bo później zostają)
Kojarzę MVC, ale szczerze mówiąc nie mogę tego w pełni ogarnąć
PSR-2 i PSR-4. Zapewne chodzi Ci o klamerki i spacje, tak?

Skąd wywnioskowałeś, że mam za dużo kodu w header.php? Pytam z ciekawości
zrobiłem u siebie tak, że w pliku index.php mam 100% PHP i tam jest m.in router, który następnie includuje header, treść docelową, footer. 
z Headers() i ob_start() nie miałęm nigdy do czynienia. To służy do wstrzymywania wykonanego wyniku w PHP do przeglądarki, tak?
i faktycznie. Brakuje else dla $page_name (404)

global DB

-Spokojnie pisać na chwilę można, ale po to jest refaktoryzacja - podobno uczy więcej niż kursy, bo musisz zrozumieć co autor miał na myśli. Trudno się zmobilizować, bo masz z tyłu głowy, że to Twój kod. Dlatego warto się dzielić kodem i myśleć w kategoriach jak ktoś to będzie czytał to jak często będzie WTF?

Znam Dowcip w temacie:

  • Jak pisałem ten kod tylko Bóg i ja wiedzieliśmy jak działa, teraz wie tylko Bóg.

Idea MVC miała być prosta...

Sam próbuję ją przetrawić i zrozumieć, myśl o tym w kategorii, trzech pionów które ze sobą mają nie rozmawiać, ale wykonywać zadania.
1 ustala kto przygotuje dane i skąd je ma wziąć => 2. Odbiera te dane i przekazuje do wyświetlenia => 3.
2 ustala dane
3 ma własne mechanizmy wyświetlania, nic nie wie - tylko dostaje dane (Array?) i wyświetla je

PSR

Tak to zapis - ma sens na dłuższą metę i nie wiem czemu nie mówią dlaczego - łatwiej zapamiętać.
Powodów jest wiele np. weź długi kod i zwiń wszystko (w IDE to shift + ctrl + "-" ) i rozwiń tylko fragment nad którym pracujesz.

  • inny zapis, inaczej łamie wiersze i się zwija
  • Widać różnice w klamrach przy if i function, bo przewiduje się miejsce na adnotacje z bardziej zaawansowanego programowania
  • odstępy też poprawiają czytelność - wręcz uderza po oczach jakie masz dane.
  • ilość spacji ma znaczenie jak używasz git.
    zobacz https://github.com/proget-hq/phpstan-phpspec/commit/f40fbd89ed0221222f134a60043fa304c0cd5bf0
    połowa tego commita to zmiana białych znaków (tab/spacji), to przykład znaleziony na szybko...
    ( gość który pisał to wcześniej miał tab który zajmował tyle samo co spacja, ale nikt inny tak NIE MA ustawionego wyświetlania, dlatego widać jak się rozjechało)
    itd.

Za dużo kodu

Nie tylko header.php, ale we wszystkich plikach widoku.
Teza jest z tąd, że jedyne dane które przesyłasz to $page_name, $page_title.
Może jeszcze coś jest w $account, $profile - ale z kodu to nie wynika.

Albo masz na sztywno tekst strony, wątpię bo nawet <title> i <description> musiał byś skądś brać,
albo logika jest wymieszana z html i to jest normalne na początku.

Headers()

  • daje nagłówek strony na urzytek przeglądarki.
    Możesz powiedzieć np. że ta strona to obrazek, albo plik CSV i przeglądarka próbuje tak go uruchomić, ale długo by gadać.

ob_start() i ob_end_flush();

masz kontrole co wypluwasz do przeglądarki.
( możesz skasować echo które gdzieś w kodzie masz, albo podmienić fragment kodu który już dawno wyplułeś)
Ja używam tego do raportowania błędów, albo jak chce json wysłać itp.

404

Weź pod uwagę, że każdy if może być nie wykonany.
Po co sprawdzasz? Dla bezpieczeństwa i by strona działała poprawnie?
ok, a co jak if zadziała i nie wykona kodu to będzie działać poprawnie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1