• 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

VPS Starter Arubacloud
0 głosów
548 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 (287,550 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ź 288 wizyt
pytanie zadane 16 lutego 2020 w PHP przez MAXIM7 Obywatel (1,990 p.)
0 głosów
1 odpowiedź 246 wizyt
pytanie zadane 2 stycznia 2020 w PHP przez MAXIM7 Obywatel (1,990 p.)
0 głosów
3 odpowiedzi 681 wizyt
pytanie zadane 8 kwietnia 2016 w PHP przez GaCeL Dyskutant (7,500 p.)

92,452 zapytań

141,262 odpowiedzi

319,076 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...