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

PHP i Twig - poprawna struktura plików

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
628 wizyt
pytanie zadane 18 lutego 2020 w PHP przez MAXIM7 Obywatel (1,990 p.)

Cześć wszystkim. Tworzę swój pierwszy, większy projekt - coś w rodzaju forum. Do tej pory zajmowałem się frontendem, ale teraz pomału wprowadzam elementy php. W moim projekcie mam kilkanaście podstron, na których stałymi elementami są: nawigacja oraz stopka. Z tego powodu, zacząłem używać Twiga, dla przejrzystości. Poniżej przedstawię strukturę moich plików i kodu:

Dla każdej podstrony mam plik .php i każdy z nich zawiera mniej więcej ten sam kod:

<?php
 
require_once 'lib/Twig/Autoloader.php';
Twig_Autoloader::register();
 
$loader = new Twig_Loader_Filesystem('temp');
$twig = new Twig_Environment($loader);
 
echo $twig->render('home.html');
 
?>

dodatkowo, dla każdej podstrony istnieje plik .html zawierający poszczególne elementy szablonu. Przykładowo:

{% extends "main.html" %}
 
{% block header %}
//elementy headera
{% endblock header %}
 
{% block content %}
//kontent
{% endblock content %}

oraz główy szablon main.html:

<!DOCTYPE html>
<html lang="pl">
	<head>
		{% block header %} {% endblock header %}
	</head>
 
	<body>
		{% include "nav.html" %}
 
		{% block content %} {% endblock content %}
 
		{% include "footer.html" %}
 
		<script src="login.js"></script>
	</body>
</html>

1. Czy jest to prawidłowa struktura strony? Czytałem, że każda strona powinna mieć jeden plik wejściowy, np. index.php. Co to oznacza? Czy tam powinien być po prostu kod, który obowiązuje na każdej podstronie i który powinienem dodawać do pliku .php każdej podstrony za pomocą require_once()? Czy może chodzi o to, że te wszystkie pliki .php, które stworzyłem dla każdej podstrony są nadmiarowe i powinienem je zastąpić jednym plikiem index.php? (Nie wiem, jak miałoby to wyglądać, ponieważ w każdym pliku .php renderuje przecież inny plik .html. Chyba, że za pomocą switcha, ale z tego co czytałem, to plik index.php, nie powinien być obszerny)

Zadaje to pytanie, ponieważ doszedłem do etapu gdzie stworzyłem system rejestracji i logowania na stronie. Działa on tak, że w nawigacji znajdują się dwa przyciski "zaloguj się" i "zarejestruj się". Po kliknięciu przycisku "zarejestruj się" otwiera się okno z formularzem rejestracji (po prostu w .js zamieniam display: none diva na block). Po wypełnieniu formularzu i zatwierdzeniu wykonuje się kod zawarty w pliku rejestracja.php (sprawdzanie poprawności inputów, dodawanie do bazy danych), wywołany za pomocą atrybutu action="rejetracja.php" w znacznikach <form></form>...

//przy okazji drugie pytanie: 2. Czy wywoływanie w ten sposób kodu (za pomocą action) odpowiedzialnego za rejestracje jest prawidłowe? bezpieczne? Czy można to zrobić lepiej?

...Po wykonaniu kodu rejestracji chciałbym, aby ponownie pokazała się podstrona, na której został kliknięty przycisk "zarejestruj się" (jeżeli ktoś się rejestrował na stronie głównej, to niech pojawi się strona główna, jak na innej, to ta inna). I właśnie tu zastanawiam się, że ten plik index.php, o którym wspominałem w pytaniu 1. mógłby się tutaj przydać. Tzn. jakby był dodany do każdego pliku .php wszystkich podstron (za pomocą require_once()), to można by było zrobić tak:

W pliku index.php umieścić:

session_start();
 
if ( !isset( $_SESSION["origURL"] ) )
    $_SESSION["origURL"] = $_SERVER["HTTP_REFERER"];

A pod koniec pliku rejestracja.php:

header('Location: '.$_SESSION["origURL"]);

3. Czy dobrze myślę, że do takich rzeczy przeznaczony jest index.php?

1 odpowiedź

+1 głos
odpowiedź 18 lutego 2020 przez Arkadiusz Waluk Ekspert (289,990 p.)
wybrane 20 lutego 2020 przez MAXIM7
 
Najlepsza

1. Dobrze słyszałeś z jednym plikiem wejściowym. Chodzi o to, aby wejście pod dowolny adres aplikacji uruchamiało zawsze jeden główny plik. W tym pliku inicjuje się najczęściej aplikacja, routing i inne rzeczy. To w samej aplikacji zapada decyzja co ma zrobić dla danego adresu. Czyli nie decyduje o tym (pośrednio) serwer poprzez to czy wywołasz registration.php czy login.php i tam jest kod na jedną akcję, tylko za każdym razem uruchamiany jest jeden główny plik. I tam to routing na podstawie adresu decyduje co ma zrobić, najczęściej przewija się model MVC i podobne, wtedy uruchamia dany kontroler, który coś robi i zwraca odpowiedź. 

Plików PHP (i nie tylko) jest oczywiście zawsze w projekcie wiele, najczęściej są to różne klasy kontrolerów, klasy z inną logiką itd. Za pomocą switcha można sobie jakiś taki uproszczony routing zrobić, ale w praktyce raczej nikt tego tak nie robi. Polecam zainteresować się frameworkami PHP, dwa najpopularniejsze to Symfony i Laravel. Tam zobaczysz pewne rozwiązania, których nie wymyśla się na nowo za każdym razem. Oczywiście najpierw wypada znać w miarę PHP, chociaż podstawy obiektowości i mieć minimalne pojęcie o Composerze i autoloadingu. Jak nie chcesz wchodzić w temat frameworków to ewentualnie możesz zobaczyć jakieś mniejsze pojedyncze biblioteki routingu dla PHP.

2. Samo action w formularzu raczej specjalnie nie wpłynie, równie dobrze ktoś może wziąć jakiegoś nego klienta HTTP i wysłać z niego zapytanie do Twojego serwera pod adres z action. Skupiłbym się więc bardziej na zabezpieczeniach tego co się dzieje po przesłaniu formularza i jak jest on obsługiwany.

Po wykonaniu kodu rejestracji chciałbym, aby ponownie pokazała się podstrona, na której został kliknięty przycisk "zarejestruj się" (jeżeli ktoś się rejestrował na stronie głównej, to niech pojawi się strona główna, jak na innej, to ta inna)

Możesz spróbować z HTTP_REFERER, ale trzeba mieć na uwadze, że tego nagłówka może nie być/może być zmieniony przez klienta wysyłającego request. Przydałoby się więc go sprawdzić, dodać wartość domyślną. Ewentualnie możesz wszędzie gdzie jest link do rejestracji go zmienić dodając parametr GET z informacją skąd ktoś idzie, np. na stronie logowania link będzie registration.php?from=login. Wtedy po rejestracji odczytujesz wartość from i jeśli jest to przekierowujesz.

3. W podejściu opisanym przeze mnie w punkcie 1 nie za bardzo, index.php powinien tylko zainicjować aplikację i nic więcej. W podejściu takim jak stosujesz obecnie z kolei nie ma raczej zbytniego porządku i określonych ról.

Podobne pytania

0 głosów
1 odpowiedź 327 wizyt
pytanie zadane 16 lutego 2020 w PHP przez MAXIM7 Obywatel (1,990 p.)
0 głosów
1 odpowiedź 291 wizyt
pytanie zadane 2 stycznia 2020 w PHP przez MAXIM7 Obywatel (1,990 p.)
0 głosów
3 odpowiedzi 745 wizyt
pytanie zadane 8 kwietnia 2016 w PHP przez GaCeL Dyskutant (7,500 p.)

93,188 zapytań

142,204 odpowiedzi

322,027 komentarzy

62,515 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2704p. - Tomasz Bielak
  5. 2678p. - Łukasz Siedlecki
  6. 2627p. - CC PL
  7. 2485p. - Marcin Putra
  8. 2443p. - rucin93
  9. 2418p. - Michal Drewniak
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 2127p. - Michał Telesz
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...