Gå til innhold

Points lager applikasjon - samletråd


Anbefalte innlegg

God dag. Jeg fant ingenting om at dette ikke var lov, men jeg synes det er praktisk å kunne samle alt i en egen tråd slik at vi slipper å ha rundt 30 tråder med dumme spørsmål.

 

Jeg er i gang med å lage en applikasjon ved å benytte MVC (Model View Controller). Har sett gjennom tutorials og litt og har så vidt startet. Jeg ser at de i tutorialene gjør det ekstra vanskelig med mye avanserte saker og mye jeg insinuerer er fullstendig unødvendig. I stedet for å skrive side inn og side ut med ting jeg ikke mener hører hjemme, så prøvde jeg meg på min egen lille versjon.

 

index.php finner ut via urlen hvilken controller den skal hente. I en tutorial jeg så ble det skrevet en lang index.php med en hel haug funksjoner og mye annet tull. Her er min:

 

<?php

// Forespurt URL
$url = $_SERVER['REQUEST_URI'];

// Fjerner root fra URL
$url = str_replace('/points/', '', $url);

// Splitter resultatet
$matches = explode('/', $url);

$controller = $matches[0];
$argument = $matches[1];
$id = $matches[2];

// Velger controller
if($controller == 'blog' || $controller == 'portfolio' || $controller == 'movies' || $controller == 'info')
{
	include($_SERVER['DOCUMENT_ROOT'].'/points/controller/'.$controller);
}
else
{
	echo 'finner ingen controller';
}
?>

 

Er koden stygg? Kan jeg gjøre ting bedre? Mangler det noe? Skrik ut!

 

Dette prosjektet er for å lære meg PHP på en ordentlig og ryddig måte.

 

:)

Endret av Points
Lenke til kommentar
Videoannonse
Annonse

Er målet med den koden, bare at du skal hente ut parametre fra url'en? Hvis du skal lage ett større prosjekt med MVC så ville jeg vurdert å benytte meg av ferdige PHP ramme verk slik som f.eks symfony, prado eller andre. De fleste støtter url omskrivning native slik at du lett kan lage fine url'er på forskjellige formater og slipper lage kode for dette selv.

 

Så noen kommentarer på koden. (mine personlige preferanser og andre vil sikkert være uenige)

 

Jeg ville sjekket at verdiene du henter far $matches faktisk er satt med isset før du prøver å hente dem, i tilfelle $url har færre parametre enn du forventer.

 

Ett annet alternativ jeg er veldig glad i, er å benyte regular expressions. Hvis formatet på urlen din alltid er /points/$controller/$argument/$id kan man bruke en regex som dette:

preg_match('/^\/points\/(.+)\/(.+)\/(.+)\/$/i', $_SERVER['REQUEST_URI'], $matches);

Da holder det bare å sjekke isset på $matches så vil du se om alle verdiene er satt eller ikke.

 

Før du inkluderer den filen med include, ville det vært en ide å sjekke om filen faktisk eksisterer eller føler du at du har dekket det med å bare godta ett par kontrollere? Kanskje det hadde holdt å sjekke om $controller er gyldig verdi hvis filen faktisk eksisterer? Da vil du slippe å legge til nye gyldige controllere i if setningen hver gang det blir noen forandringer.

 

Hadde du ikke spurt etter kommentarer så hadde jeg aldri kommentert disse tingene siden koden din er helt ok :)

Lenke til kommentar

Du må hardkode inn hver eneste controller. Hadde vært bedre å kjøre en sjekk på om controlleren eksisterte. F.eks.

1. Request: /articles/edit/id

2. Sjekke om filen ArticlesController.php eksisterer og inkluder den, hvis ikke, kast exception

3. Sjekke om klassen ArticlesController eksiterer (class_exists(...)), hvis ikke, kast exception

4. Kjør metoden editAction() om den eksisterer.

 

:)

Lenke til kommentar
Er målet med den koden, bare at du skal hente ut parametre fra url'en? Hvis du skal lage ett større prosjekt med MVC så ville jeg vurdert å benytte meg av ferdige PHP ramme verk slik som f.eks symfony, prado eller andre.

Muligens ved en senere anledning, men akkurat nå skal jeg lære, og da blir det litt dumt å bruke ferdiglaget.

 

Takk til begge for kommentarer! Nøyaktig hva jeg var ute etter i denne tråden. Skal lese dem nøye og prøve å få det til.

Endret av Points
Lenke til kommentar
Jeg ville sjekket at verdiene du henter far $matches faktisk er satt med isset før du prøver å hente dem, i tilfelle $url har færre parametre enn du forventer.

Eneste jeg trenger foreløpig er controlleren. $argument og $id trenger ikke å være satt og dette sjekker jeg i controlleren.

 

Ett annet alternativ jeg er veldig glad i, er å benyte regular expressions. Hvis formatet på urlen din alltid er /points/$controller/$argument/$id kan man bruke en regex som dette:

preg_match('/^\/points\/(.+)\/(.+)\/(.+)\/$/i', $_SERVER['REQUEST_URI'], $matches);

Da holder det bare å sjekke isset på $matches så vil du se om alle verdiene er satt eller ikke.

Alle parameterene trenger ikke være satt da f.eks. om kun $controller er satt vil den vise forsiden på f.eks. blogg.

 

Før du inkluderer den filen med include, ville det vært en ide å sjekke om filen faktisk eksisterer eller føler du at du har dekket det med å bare godta ett par kontrollere? Kanskje det hadde holdt å sjekke om $controller er gyldig verdi hvis filen faktisk eksisterer? Da vil du slippe å legge til nye gyldige controllere i if setningen hver gang det blir noen forandringer.

Done.

 

 

<?php

// Forespurt URL
$url = $_SERVER['REQUEST_URI'];

// Fjerner root fra URL
$url = str_replace('/points/', '', $url);

// Splitter resultatet -> setter sammen filplassering
$matches = explode('/', $url);

$controller = $matches[0];
$argument = $matches[1];
$id = $matches[2];

$filename = $_SERVER['DOCUMENT_ROOT'].'/points/controller/'.$controller.'.php';

// Sjekker at controller eksisterer -> kjører controller
if(file_exists($filename))
{
	include($filename);
	echo 'filen eksisterer';
}
else
{
	echo 'finner ingen controller';
}

?>

Lenke til kommentar

Det er ganske stor forskjell på et include-skript og et MVC-rammeverk, og jeg vil si at den metoden du har nå vil egne seg svært lite senere. Som sagt så anbefaler jeg deg å se på andre rammeverk (jeg ble veldig glad i Zend Framework, men har nå nesten sluttet helt med PHP av diverse grunner).

Lenke til kommentar

Jeg har dessverre en tendens til å skumme gjennom flere video-tutorials for å prøve å skjønne ting. Ender opp slik som nå. Tenkte jeg skulle sette meg ned nå og gå gjennom alle de 13 delene og kode av nøyaktig det han skriver. Så får vi se om jeg kommer tilbake med en ny index.php-fil som forhåpentligvis er riktig.

 

:)

Lenke til kommentar
Det er ganske stor forskjell på et include-skript og et MVC-rammeverk

I video-tutorialen så gjøres det på en annen måte. Han bruker regulære uttrykk (?) for å lese av URLen. Men prinsippet er jo det samme som jeg har. Lese av URLen, finne ut hvilken controller som skal brukes, og dermed inkludere denne controlleren. Skjønner ikke hvordan det da ikke kan være MVC-rammeverk (hvertfall starten på et) da han i video-tutorialen gjør det på den måten. Og det virker som om denne karen har en god del erfaring.

 

Slik ser min index.php ut nå:

 

<?php

// Starter session
session_start();

// Henter konfigurasjon
include "config.php";

// Henter URL
$url = $_SERVER['REQUEST_URI'];

// Fjerner root fra URL
$url = str_replace('/'.APP_ROOT.'/', '', $url);

// Deler opp i controller, argument og id
$url = explode("/", $url);

$controller = $url[0];
$action = $url[1];
$id = $url[2];

// Sjekker om controller eksisterer
if(file_exists(CONTROLLER_PATH.$controller.'.php'))
{
	include(CONTROLLER_PATH.$controller.'.php');
}
else
{
	exit('Denne siden eksisterer ikke!');
}

// Layout
include(VIEW_PATH.'layouts'.DS.'application.php');

?>

 

.. den finner ut hvilken controller den skal bruke. Den henter controlleren (som jeg ikke har laget enda). I controlleren henter jeg modellen (eks. models/blog.php) slik at jeg har funksjonene klare. Etter dette finner jeg ut hvilken view som skal hentes, og henter den og kjører de funksjonene som må kjøres.

 

models/blog.php:

 

<?php

/**
 * create_post
 * tilføyer en ny post i "blog"
 */
function create_post($params)
{
	$connection = db_connect();

	$query = sprintf	("INSERT INTO blog
						(title, body, created_at, user_id)
						VALUES
						('%s', '%s', %d, %d)",
						mysql_real_escape_string($params['title']),
						mysql_real_escape_string($params['body']),
						mysql_real_escape_string($params['created_at']),
						mysql_real_escape_string($params['user_id'])						
						);

	$result = mysql_query($query);

	if(!$result)
	{
		return false;
	}
	else
	{
		return true;
	}
}



/**
 * update_post
 * oppdaterer en eksisterende post i "blog"
 */
function update_post($params)
{
	$connection = db_connect();

	$query = sprintf	("UPDATE blog
						SET
						title = '%s',
						body = '%s',
						edited_at = %d,
						user_id = %d
						WHERE id = %d",
						mysql_real_escape_string($params['title']),
						mysql_real_escape_string($params['body']),
						mysql_real_escape_string($params['edited_at']),						
						mysql_real_escape_string($params['user_id']),						
						mysql_real_escape_string($params['id'])						
						);

	$result = mysql_query($query);

	if(!$result)
	{
		return false;
	}
	else
	{
		return true;
	}
}



/**
 * delete_post
 * sletter en eksisterende post i "blog"
 */
function delete_post($id)
{
	$connection = db_connect();

	$query = sprintf	("DELETE FROM blog
						WHERE id = %d",
						mysql_real_escape_string($id)						
						);

	$result = mysql_query($query);

	if(!$result)
	{
		return false;
	}
	else
	{
		return true;
	}
}

?>

 

 

Har en del andre filer sånn som config.php, database.php osv.

 

Men; er jeg helt på jordet her?

Lenke til kommentar

Den forige posten er bare å glemme, det ble surr. Det jeg har gjort nå er å slette forige applikasjon jeg holdt på med. Denne gangen har jeg ikke lov å bruke video tutorialen, og alt jeg gjør må jeg enten finne ut selv, eller spørre om her. Jeg har nå kommet til routing-systemet, og sitter bom fast. Jeg skjønner absolutt ikke regex og det gjør at jeg ikke kommer lenger. Prøvde å titte gjennom en tutorial for regex, men jeg ble rett og slett svimmel.

 

Jeg trenger regex som matcher disse url'ene:

(Slash på slutten trenger ikke være der, men må kunne leses av selv om den er der.)

 

rs = random string

rd = random digit

 

blog/

blog/rs/

blog/rs/rs/

blog/view/rd/

 

portfolio/

portfolio/rs/rs/

portfolio/view/rd/

Endret av Points
Lenke til kommentar

$controllers = array('blog', 'portfolio');
$regex = sprintf('#%s(/(.-)(/(.+))?)?/?#', implode('|', $controllers));

Tror denne skal virke, men jeg har ikke prøvd den.

 

Hvis du bare skal dele på '/' så er nok explode det beste valget.

Endret av itsmebth
Lenke til kommentar

Fikk det til.

 

Som dere kanskje har sett har jeg en funksjon som heter find_post. Denne henter ut den riktige posten etter spørring. Men det jeg lurer på: sånn som å gjøre om BB-kode, avsnitt osv. Skal jeg gjøre det i find_post eller skal dette inn i en ny funksjon?

Endret av Points
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...