Php Slim Framework Opsætning

30 jul

1

Hej verden!

Det er efterhånden mange uger siden jeg sidst har skrevet her på bloggen, men da det jo er sommerferie har jeg haft massere af tid til at rode med en masse ting på computeren. Dette har resulteret i jeg har massere nyt at berette om og denne gang vil jeg forklarer lidt om hvordan jeg har anvendt et micro framework ved navn Slim.

I frameworket har jeg “integreret” to yderligere værktøjer som gør det nemmere at anvende frameworket og opsplitte de enkelte dele i en applikation. Ideén med et framework er at gøre det nemmere og hurtigere at udvikle applikationer. Dog er det ikke derfor jeg har valgt at anvende et framework til mine fremtidig projekter. Fordelene ved et framework er nemlig også at man naturligt får struktureret sin kode, sådan at man senere kan gå tilbage og lave rettelser, hvilket også gør det nemmere for andre at ændre og opdaterer koden hvis dette bliver nødvendigt.
Arbejder man på større projekter hvor man har en webdesigner til at lave frontend designet, kan han/hun nemt og hurtigt bruge funktioner fra det bagvedliggende system uden at skulle vide noget om hvad der sker unde rmotorhjelemen. Præcis dette vil jeg forklare mere om under afsnittet om RainPTL, som er en såkaldt template engine.

Slim Frameworket

Det er efterhånden blevet rimeligt udbredt blandt mange php udviklere at bruge de såkaldte frameworks. Frameworks gør det nemmere og hurtigere at udvikle applikationer og de kender måske allerede frameworks som Codeigniter, CakePhp, Symfony eller Zend Framework. Fælles for disse fire frameworks er at de alle anvender MVC strukturen til at holde styr på de forskellige aspekter af en applikation.

Dog er min synes jeg ikke at der er behov for at splitte koden så meget op som denne struktur ligger op til og derfor har jeg valgt at anvende et micro framework hvilke både har sine fordele og ulemper.

Der findes et hav af micro frameworks til php, et af de mere respekterede hedder Slim og det er præcis dette jeg har valgt at anvende. Før jeg tog denne beslutning legede jeg også med Flight som er rigtigt fedt og med mange muligheder for udvidelse. Men da alle methods and properties i dette framework er statiske valgte jeg i stedet Slim.

Slim’s mål er som navnet lyder at være utrolig minimalistisk og i princippet kun gøre en opgave nemlig, at danne den ydre ramme om applikationen og intet andet. Denne opgave udføres ved at lave en “route” i slim som fortælle hvilke funktion som skal vises når en bestemt url bliver kaldt i addresse baren. En meget simpel “hello world” funktion i Slim kan se således ud.

1
2
3
4
5
6
7
8
9
10
11
<?php

require( 'STI TIL DIN SLIM.PHP FIL' );
$app = new Slim();

$app->get( '/', function() {
echo "Hello World";
});

$app->run();
?>;

Den meget simple applikation ovenfor gør det følgende:

  1. Inkludere frameworket som er en fil man downloader for Slim’s hjemmeside. Denne fil er nødvendig hvis man ønsker at bruge frameworket. Det svarer lidt til at inkludere en stylesheet fil
  2. Variablen $app bliver tildelt slim frameworket, så man gennem denne kan anvende frameworket. Det er muligt at sætte en lang række instillinger i dette punkt, det har vi dog ikke valgt at gøre her.
  3. Nu kommer det spændende. Frameworket bliver bedt om at kører en bestemt funktion når addressen / bliver efterspurgt i browseren via. en GET request. Derefter kører funktionen mellem de krølede parenteser og heri bliver der skrevet Hello World til browseren. Har du ikke version 5.3.x versionen af php skal dene Hello World applikation skrives på en anden måde, det vil jeg dog ikke gå dybere ind i, i dette indlæg
  4. Afslutningsvist køres applikationen og frameworket starter programmet.

NotORM

Da Slim frameworket ikke kan meget andet end at kalde den funktion som browseren efterspørger, er det nødvendigt at integrerer sine egne klasser, funktioner, hjælpere eller hvad man ellers har behov for, hvis man ønsker yderligere muligheder. Dette har jeg ikke noget mod, for ønskede jeg et framework med alle muligheder i forvejen integreret havde jeg valgt et af de tidligere omtalte frameworks.

NotORM er en hjælper til at snakke sammen med din database. NotORM bruger pdo database laget til forbinde til databasen hvilket betyder at du gennem NotORm både kan anvende Mysql, SQlite og en række andre databaser uden problemer. Jeg bruger udelukkende Mysql, så dette vil jeg fokuserer på i dette indlæg.

Jeg har valgt NotORM fordi det er rimelig simpelt og har samtidig en flot syntax :)
Se bare her hvordan man kan få alle rows ud af en tabel hurtigt og nemt:

1
2
3
<?php
$result = $db->fiktiv_tabel->limit( 10 );
?>;

Linjen ovenfor modtager de første 10 rækker en den fiktive tabel. Mere simpelt kan det næsten ikke blive.

I den index fil som du kan se i bunden af dette indlæg, kan du se hvordan jeg har integreret NotORM i min Slim applikation.

RainTPL

RainTPL er den mest simple template engine som overhovedt findes. RainTPL har kun 8 forskellige metoder man skal huske, hvilket gør det super nemt for designere, hurtigt at designe frontend delen af din app.

RainTPL vil typisk modtage variable eller array fra dine routes, hvorefter designeren eller dig selv kan bestemme hvor variablen eller data fra et array skal vises. Frodelen ved RainTPL er at der ikke bruges php på nogen måde. Dette er faktisk lidt en løgn for man skriver faktisk php bare på html form. Dette kan bedre forklares med et lille eksempel.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// RainTPL - Vis en variable
{$variable_navn}

// Php - Vis en variable
echo $variable_navn

// RainTPL - Sådan laver man en løkke gennem et array og viser indholdet
{loop='$array_name'}
{key} .{value.name}
{/loop}

// Php - Sådan viser man indholdet af et array i php
foreach( $array_name as $key => $value)
{
echo $key . $value;
}

Selve opsætning

Nu når du ved en masse om hvad de tre værktøjer kan, er det tid til at se på hvordan man kombinerer det hele. Jeg har struktureret min applikation i følgende mapper, men følgende indhold.

Resources
- NotORM
- NotORM filer
- RainTPL
- RainTPL filer
- Yderligere ressourcer som f.eks. jQuery, LESS, yderligere klasser osv.

Slim
- Selve slim frameworket ligger i denne mappe.

Templates
- Alle template filer ligger i denne mappe.
- Udelukkeden html, css, js filer må ligge i denne mappe efter hensigten, altså kun de filer som viser selve applikationen.

Routes
- I denne mappe ligger alle php filer som bestemmer hvad applikationen skal gøre
- Det er disse filer som validerer data, snakker sammen med databasen osv.

- index.php
- config.php
- my_view.php

Index filen og alt dens magi

I index filen sker alt det magiske. Det er nemlig index filen som sørger for at binde applikationen sammen. Min index fil har jeg vedhæftet nederst i dette indlæg. Der er dog behov for at knytte en række kommentare til den for at forstå den.

Filen kan ikke fungerer uden config.php, da der i denne fil står oplysninger om databasen m.m.
I index filen inkluderes alle filer i mappen “Routes”. Dette gøres ved automatisk at scanne mappen Routes og derefter tjekke om indholdet er en fil eller en mappe. Hvis det er en fil inkluderes den. Denne metode er langsom hvis mappen indeholder rigtig mange filer. Derefter anbefaler jeg at man manuelt skriver inkluderingerne ind hvis man har mere end 10 filer i mappen, eller evt. cache filerne som bliver scannet evt. med memcached.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php

/**
* Includes the necessary files for the system to work
* 1. The Micro Framework Slim
* 2. The custom view class
* 3. The NotORM databasebase communicator helper
* 4. The configuration file
*/

require( 'Slim/Slim.php' );
require( 'my_view.php' );
require( 'config.php' );
require( 'Resources/Validator.php' );
require( 'Resources/ApiClient.php' );

/**
* Starts the app and instiates the Slim framework
*/

$slim_settings = array(
'mode' => 'development',
'templates.path' => './Templates',
'view' => new my_view(),
);
$app = new Slim( $slim_settings );

/**
* Connects to the database and instantiates the db object
*/

if( DB_CONNECTION ) {
require( 'Resources/NotORM.php' );
$pdo = new PDO( DB_TYPE . ":dbname=" . DB_NAME . ";" . DB_SERVER, DB_USER, DB_PASSWORD );
$db = new NotORM($pdo);
}

/**
* Defines the routes by including all files in the folder called Routes
* Consider to write out all the routes one by one if there are more than 10 routes, needed to be included.
* This will increase performance.
*/

$route_path = "./Routes/";
$dir = scandir( $route_path );
foreach( $dir as $item )
{
$file = $route_path . $item;
if( is_file( $file ) ) { require( $file ); }
}

/**
* Starts the app
*/

$app->run();
Share
Relaterede indlæg
Fatal error: Call to undefined function related_posts() in /home/gustav/websites/gustavs.dk/blog/wp-content/themes/bueno/single.php on line 61