Per velocizzare il nostro test useremo alcune dipendenze che andiamo ad installare tramite Composer, il file composer.json
sarà questo:
{
"require": {
"silex/silex": "^1.3",
"symfony/twig-bridge": "~2.7|3.0.*",
"twig/twig": "~1.8|~2.0"
},
"require-dev": {
"symfony/browser-kit": "^3.0",
"phpunit/phpunit": "~4"
}
}
Nel nostro progetto comparirà una cartella vendor
con una serie di librerie caricate. In particolare stiamo usando Silex un micro-framework basato su Symfony e Twig come template engine. Per lo sviluppo locale abbiamo necessità di avere un database MySQL identico a quello creato nel Cloud.
Quindi come primo passaggio creiamo un file app.yaml
praticamente identico a quelli precedentemente commentati:
runtime: php55
api_version: 1
threadsafe: true
handlers:
- url: /.*
script: index.php
Il primo file da caricare sarà index.php
:
require __DIR__ . '/vendor/autoload.php';
$app = require __DIR__ . '/app.php';
$app['debug'] = true;
$app->run();
Questo file esegue il bootstrap del nostro framework e carica il file app.php
:
use Silex\Application;
use Silex\Provider\TwigServiceProvider;
use Symfony\Component\HttpFoundation\Request;
$app = new Application();
$app->register(new TwigServiceProvider());
$app['twig.path'] = [ __DIR__ ];
Creiamo la nostra applicazione e impostiamo le informazioni necessarie per la gestione del template engine.
Impostiamo la connessione al database:
$app['database'] = function () use ($app) {
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=note;';
$user = 'root';
$password = '';
$db = new PDO($dsn, $user, $password);
return $db;
};
Attenzione a $dsn
, $user
e $password
, questa configurazione è valida per l'ambiente locale, prima del deploy le informazioni andranno aggiornate con i dati reali del Cloud.
Di seguito la visualizzazione delle note inserite nel database:
$app->get('/', function () use ($app) {
$db = $app['database'];
$twig = $app['twig'];
$results = $db->query('SELECT * FROM mienote');
return $twig->render('cloudsql.html.twig', [
'results' => $results,
]);
});
Intercettiamo le chiamate in GET
, connettiamoci al database, eseguiamo una semplice SELECT
e andiamo a inviare i dati al template. La visualizzazione delle informazioni sarà piuttosto spartana:
{% if results %}
<h2>Note inserite</h2>
{% for row in results %}
<div><strong> {{ row.nome }} </strong> {{ row.contenuto }}</div>
{% endfor %}
{% endif %}
Un ciclo for
stamperà i risultati (se esistono).
Nel template inseriamo anche un form per aggiungere note al nostro database:
<h2>Scrivi una nota</h2>
<form action="/" method="post">
<div><label for="nome">Nome:</label><br><input name="nome" id="nome" /></div>
<div><textarea name="contenuto" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Vai"></div>
</form>
Il form eseguirà un invio a se stesso che andremo ad intercettare nel nostro file app.php
:
$app->post('/', function (Request $request) use ($app) {
$db = $app['database'];
$nome = $request->request->get('nome');
$contenuto = $request->request->get('contenuto');
if ($nome && $contenuto) {
$stmt = $db->prepare('INSERT INTO mienote (nome, contenuto) VALUES (:nome, :contenuto)');
$stmt->execute([
':nome' => $nome,
':contenuto' => $contenuto,
]);
}
return $app->redirect('/');
});
Lo switch sull'URL /
avviene in base al metodo della chiamata get/post. Creo la connessione al database, leggo le variabili e poi con PDO faccio l'inserimento. Ultimo passaggio è il redirect via GET
su /
per vedere i risultati.
A questo punto basta lanciare l'applicazione per vederla in funzione su localhost:8080
. Prima di procedere al deploy si dovranno aggiornare le variabili di connessione, una volta caricato tutto sul server si può accedere all'applicazione online.