MVC Simple Example

PHP Programowanie dodano: 28.05.2019
EDYCJA 29.05.2019

MVC: paradygmat architektury, struktura plików w aplikacji, sposób myślenia, sposób przekazywania informacji.
Model: Baza Danych
View: Przeglądarka, kod HTML
Controler: Serwer, kod PHP, klasy, np login, user_profile
Stary sposób: Przeglądarka -> Serwer -> Baza Danych -> Generowanie strony -> przeglądarka
MVC yT

STRUKTURA PLIKÓW

-- clasess
      |- Database.php
      |- Route.php
-- Controllers
      |- AboutUs.php
      |- Route.php
      |- Controller.php
      |- Index.php
-- Views
      |- AboutUS.php
      |- ContactUs.php
      |- Index.php
- .htaccess
- Routes.php
- index.php

1. ROUTING

1.1. Stworzenie pliku .htaccess

  1. RewriteEngine On
  2. RewriteRule ^([^/]+)/? index.php?url=$1 [L,QSA]

Każdy adres URL zostanie przesłany do pliku index.php.
Znacznik QSA (qsappend) W przypadku obecności tego znacznika mechanizm przepisywania pobierze oryginalny ciąg znaków zapytania i dopisze do niego ciąg znaków wygenerowany przez regułę.
$1 odnosi się do pierwszej grupy przechwyconej przez wyrażenie regularne (tj. Między nawiasami).
Znacznik L – (Last) pozwala na zatrzymanie przetwarzania reguł RewriteRule po skutecznym dopasowaniu adresu URL do reguły – reguła zostanie wykonana jako ostatnia (następne już nie zostaną wykonane)
wyrażenia regularne:
^położenie początkowe w dowolnym wierszu.
? Zero lub jedno wystąpienie.
+ Wystąpi jeden lub więcej razy
( Rozpoczyna grupowanie (przetwarzanie ciągu znaków, jakby był to pojedynczy element)
[^ ] jeden znak nie znajdujący się w tym nawiasie.

1.2 Plik index.php:

  1. function __autoload($className){
  2. if(file_exists('classes/'.$className.'.php')){
  3. require_once('classes/'.$className.'.php');
  4. }
  5. else if(file_exists('Controllers/'.$className.'.php')){
  6. require_once('Controllers/'.$className.'.php');
  7. }
  8. }
  9. require_once('Routes.php');

magiczna globalna funkcja __autoload() automatycznie dołącza pliki klas przy próbie utworzenia instancji danej klasy. Jako argument pobiera nazwę klasy do załadowania.
Niestety tylko jedna taka funkcja na raz może być zdefiniowana, więc jeśli dołączymy do skryptu bibliotekę, w której również znajduje się jej definicja, powstaje konflikt.

1.3 Plik Routingu (ścieżek) Routes.php

  1. Route::set('index.php', function(){
  2. //echo 'index.php';
  3. //controllers
  4. Index::CreateView('Index');
  5. });
  6.  
  7. Route::set('about-us', function(){
  8. AboutUs::CreateView('AboutUs');
  9. AboutUs::test();
  10. });
  11.  
  12. Route::set('contact-us', function(){
  13. ContactUs::CreateView('ContactUs');
  14. });

klasa Route, funkcja statyczna set (nie wymagająca instancji klasy)
set: 2 parametry: nazwa ścieżki, function: dostęp do ścieżki,

1.4 Klasa Route

  1. class Route{
  2.  
  3. public static $validRoutes = array();
  4.  
  5. public static function set($route, $function){
  6.  
  7. self::$validRoutes[] = $route;
  8. // print_r(self::$validRoutes);
  9. // echo 'route: '.$route;
  10.  
  11. if($_GET['url'] == $route){
  12. //echo '$route: '.$route;
  13. $function->__invoke();
  14. }
  15. }
  16. }

$this używamy w celu odniesienia się do danej instancji obiektu. Oznacza to, że chcąc odwołać się do niestatecznego pola używamy właśnie $this -> pole.
Jeżeli chcemy odwołać się do statycznego pola klasy to wtedy używamy self::pole.
Static odnosi się do metod/atrybutów danej instancji klasy. Najczęściej jest wykorzystywany w metodach statycznych w celu zapewnienia, że wewnątrz zawsze będzie wykonywana metoda z najniższej (ostatniej dziedziczącej) klasy potomnej. Działa tak samo, jak zastosowanie $this w metodach nie statycznych, czyli jeżeli metoda została nadpisana, to zostaje wywołana metoda, która ją nadpisała.
self - odwołanie do statycznej metody lub właściwości klasy
$this - odwołanie do metody lub właściwości w obiekcie tej klasy

Metody magiczne to w zasadzie normalne metody, ale nazywane magicznymi, ponieważ wywoływane są automatycznie w momencie wykonania danych akcji. Występują tylko w kontekście klas, a ich nazwy zaczynają się od __ . Metody magiczne muszą być publiczne (modyfikator public). W innym przypadku kod nie zadziała.
__invoke - daje możliwość wykonania obiektu jako funkcji.

2. CONTROLLERS

2.1 Controller

  1. class Controller extends Database{
  2.  
  3. public static function CreateView($viewName){
  4. echo '

    View created! class: '.__CLASS__.'

    '
    ;
  5. require_once('./Views/'.$viewName.'.php');
  6. }
  7. //static::doSomething();
  8. }

2.2 Index.php

  1. class Index extends Controller{
  2. // ...
  3. }

2.3 AboutUs.php

  1. class AboutUs extends Controller
  2. {
  3. public static function test(){
  4. echo 'file: '.__FILE__.', class: '.__CLASS__.' : ';
  5. print_r(self::query("SELECT * FROM users"));
  6. }
  7. public static function doSomething(){
  8. echo '

    function: '.__FUNCTION__.', class: '.__CLASS__.', file: '.__FILE__.'.

    '
    ;
  9. print_r(self::query("SELECT * FROM users"));
  10. }
  11. public static function CreateViewAboutUs(){
  12. echo '< h 2> AboutUs view';
  13. }
  14. }

2.4 ContactUs

  1. class ContactUs extends Controller {
  2. // ....
  3. }

3. VIEWS

3.1 AboutUs

  1. echo '

    view about us. FILE: '.__FILE__.'

    '
    ;

3.2 ContactUs

  1. <p>view contact us</p>

3. 3 Index.php

  1. <h2>Welcome!</h2>
  2. <p>view index</p>

4. DATABASES - MODEL

4.1 Database

  1. class Database
  2. {
  3. public static $host = 'localhost';
  4. public static $dbName = 'mvc_yt';
  5. public static $userName = 'root';
  6. public static $password = '';
  7.  
  8. private static function connect(){
  9. //$pdo = new PDO('mysql:host=localhost;dbname=xxx;charset=utf-8', 'root', '');
  10. $pdo = new PDO("mysql:host=".self::$host.";dbname=".self::$dbName.";charset=utf8", self::$userName, self::$password);
  11. // ustawiają żądanie, aby wszelkie błędy zapytania raportowane były jako wyjątki.
  12. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  13. return $pdo;
  14. }
  15.  
  16. public static function query($query, $params = array()){
  17. $statement = self::connect()->prepare($query);
  18. $statement->execute();
  19.  
  20. if(explode(' ', $query[0] == "SELECT")){
  21. $data = $statement->fetchAll();
  22. return $data;
  23. }
  24. }
  25. }

Inne artykuły z kategorii PHP >>>

Wzorzec projektowy MVC.Dlaczego PHPBasic Database ClassOOP. Wstęp.Bezpieczeństwo$this self static increment

Losowe zdjęcia


O sobie


gawronski
A.D. 2016

Lubię jazdę na rowerze, wspinaczkę, czytać książki i biegać. Studiowałem mechanikę i budowę maszyn oraz psychologię. Nie zostałem inżynierem ani psychologiem.