LAB13 - nvbach91/4IZ278-2020-2021-LS GitHub Wiki

Cvičení 13 - It Ain't Over 'til It's Over

Povinná četba (na doma)

Náplň cvičení

  • .htaccess
  • generování PDF
  • emailování
  • SMTP servery
  • strukturované datové formáty
  • HTTP metody, CRUD, REST API
  • reminder: pilotní pull request SP

.htaccess

  • soubor pro lokalni konfiguraci Apache serveru, případně i PHP
  • konfigurace platí pro aktuální adresář a všechy pod adresáře
  • příklady: příklad, příklad
# allow indexing with +, disallow with -
Options +Indexes

# fancy indexing
IndexOptions FancyIndexing

# change the default entry point (default is index.php)
DirectoryIndex main.php

# ignore/exclude/hide file extensions
IndexIgnore *.txt *.ico

# define custom extension for php parsing
AddType application/x-httpd-php .xp

# restricting access to a certain file
<files python.conf>
    order allow,deny
    deny from all
</files>

# block access of multiple files
<FilesMatch "\.(ps|ts|pem)">
    order allow,deny
    deny from all
</FilesMatch>
# directive to enable rewrite
RewriteEngine On

# set conditions for the rules that follow

## if the request URL matches a directory dont apply any rules
RewriteCond %{REQUEST_FILENAME} !-d

## if the request URL matches a file dont apply any rules
RewriteCond %{REQUEST_FILENAME} !-f

## if the request URL matches a symlink dont apply any rules
RewriteCond %{REQUEST_FILENAME} !-l

# rules

## RewriteRule   pattern       substitution      modificators/flags
RewriteRule      ^(.*)$        index.php?path=$1   [QSA,L]


# R - redirect
# R=301 - redirect permanent
# QSA - append the query string to the final URL
# L - last rule/redirect in the list
# F - disable access to files

Generování PDF

composer require mpdf/mpdf
  • příklad
<?php

require_once __DIR__ . '/vendor/autoload.php';

$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML('<h1>Hello world!</h1>');
$mpdf->Output('doc.pdf');

Posílání emailů

mail($to, $subject, $message, $headers);
  • pro pokročilejší maily s přílohami atp. je k dispozici řada knihoven, pomocí kterých si e-mail postupně seskládáte
    • PHP Mailer - viz příklad
      • jednoduchá, srozumitelná knihovna umožňující poslat např. HTML mail s přílohami nejen sendmailem, ale i přes SMTP server
      • pro základní použití stačí jen jeden soubor, pro komplexní instalaci využijte composer
  • Doporučeno využít SMTP služby např. GSuite, Sendgrid, Amazon SES - jsou na to knihovny
  • obecné doporučení: neprovozujte vlastní SMTP server, musí se záplatovat, škálovat, balancovat, a pravděpodobně skončíte na blacklistu

JSON

  • jednoduchý formát odvozený od zápisu objektů v jazyce JavaScript (JavaScript Object Notation)
  • výhody
    • podpora ve velkém množství jazyků
    • datově úsporný
    • jednoduchý i při ručním vytváření
  • nevýhody:
    • není standartní mechanismus kontroly dat - je nutné kontrolovat v rámci zpracovávající aplikace
    • existuje json schema, ale není moc podporované a využívané
    • nepodporuje jmenné prostory
[
    {
        "name": "dave",
        "age": 42
    }, 
    {
        "name": "jessie",
        "age": 17
    },
    {
        "name": "dana",
        "age": 23
    }
]
{
    "10": {
        "jmeno": "Josef",
        "prijmeni": "Novák",
        "email": ["[email protected]", "[email protected]"]
    },
    "12": {
        "jmeno": "Eva",
        "prijmeni": "Adamová"
    }
}

AJAX aplikace

  • komunikace mezi prohlížečem a serverem bez znovu načtení celé stránky
  • prohlížeč pošle asychronní požadavek na server a server vrátí příslušný obsah
  • klient:
$.post({
    url: './users.php',
    dataType: 'json',
}).done((resp) => {
    const users = resp.map((user) => $(`<li class="user">${user.name}: ${user.age}</li>`));
    $('#users').empty().append(users);
});
  • server:
<?php
    $data = 
    [                               // [
        [                           //   {
            'name' => 'dave',       //     "name": "dave",
            'age' => 42,            //     "age": 42,
        ],                          //   },
        [                           //   {
            'name' => 'jane',       //     "name": "jane",
            'age' => 22,            //     "age": 22,
        ]                           //   }
    ];                              // ]
    echo json_encode($data);

CRUD aplikace REST API

  • použijeme Postman jako REST testovací klient
  • principy
    • Create - POST
    • Read - GET
    • Update - PUT
    • Delete - DELETE
  • hlavička
<?php
    header("Content-Type: application/json;charset=utf-8");
    $usersDB = new UsersDB();
  • Read
<?php
    //if $_SERVER['REQUEST_METHOD'] == 'GET';
    $data = $usersDB->fetchAll();
    echo json_encode($data);
  • Create
<?php
    //if $_SERVER['REQUEST_METHOD'] == 'POST';
    $newUser = ['name' => $_POST['name'], 'age' => $_POST['age']];
    $id = $usersDB->create($newUser);
    echo json_encode(['success' => true, 'id' => $id]);
  • Update
<?php
    //if $_SERVER['REQUEST_METHOD'] == 'PUT';
    parse_str(file_get_contents("php://input"), $put_vars);
    $user = ['name' => $put_vars['name'], 'age' => $put_vars['age']];
    $data = $usersDB->update($put_vars['id'], $user);
    echo json_encode(['success' => true]);
  • Delete
<?php
    //if $_SERVER['REQUEST_METHOD'] == 'DELETE';
    parse_str(file_get_contents("php://input"), $delete_vars);
    $data = $usersDB->delete($delete_vars['id']);
    echo json_encode(['success' => true]);
⚠️ **GitHub.com Fallback** ⚠️