eigen framework / beheersysteem

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 5 ... 10 11 12 volgende »

Bart V B

Bart V B

02/01/2011 17:10:13
Quote Anchor link
@Jaron,

De tweede optie is beter. Niet de eerste. ;)
Lees de reply van Mark PHP 01/01/2011 21:49:03 nog maar eens..
 
PHP hulp

PHP hulp

27/04/2024 06:06:11
 
Pim -

Pim -

02/01/2011 17:30:56
Quote Anchor link
Er is niet zoiets als beter...

Wel zoiets als sneller en in jouw ogen overzichtelijker.
Simpele queries zijn natuurlijk prima met een API te maken, ingewikkelder niet.
Wat voor jou het beste is, hangt alleen van jouzelf af...

Persoonlijk vind ik niet-select queries sowieso handiger met een api.
 
Write Down

Write Down

02/01/2011 17:56:08
Quote Anchor link
Ik gebruik voor mooie url's MultiViews. Google :-)

Het is erg eenvoudig. Wil je alsnog een bepaalde URL iets anders, kan je nog steeds een regel maken in htaccess. (rewriterule)

Iets anders wat ik je nog zou aanraden is het gebruik van PDO, werkt altijd netjes voor je queries. Klikje
Gewijzigd op 02/01/2011 17:58:00 door Write Down
 
The Force

The Force

02/01/2011 21:17:23
Quote Anchor link
Bart V B op 02/01/2011 17:10:13:
@Jaron,

De tweede optie is beter. Niet de eerste. ;)
Lees de reply van Mark PHP 01/01/2011 21:49:03 nog maar eens..


Hoezo dat dan? Door niet zelf de queries te schrijven maak je je code abstracter. Je beschrijft meer wat je wil in plaats van hoe je dat wilt. Eén van de voordelen die dat biedt is dat je code onafhankelijk wordt van de achterliggende database. Als je later overstapt op een nieuwe versie die syntaxwijzigingen heeft (of je switcht van DB) dan hoef je alleen je config aan te passen. Het is dus meer de OO gedachte. Daarnaast dwingt Active Record automatisch veilige queries af door alles te escapen, door een XSS filter te halen enzovoorts. Er zijn inderdaad situaties waarin Active Record geen oplossing biedt.

Active Record stelt je in staat een generieke modellaag te creeëren. Hierdoor kan je sneller code ontwikkelen. Als ik afgestudeerd ben zal ik daar eens een tutorial over schrijven. Je code wordt overzichtelijker vooral als je queries genereert afhankelijk van user input. In een situatie waar je 0 of meer WHERE statements kan hebben moet je als je zelf de query samenstelt counters gaan bijhouden of een hack als 'WHERE 0=1 ' toepassen zodat je daarna 'OR kolom=waarde' kan doen. Met Active Record kan je gewoon een array meegeven ('$this->db->where($where)'). Zit er niks in dan krijg je geen WHERE. Je hoeft dus geen loopjes en if statements te maken.

Ander voorbeeld: inserten. $this->db->insert('tablename', $values). Kan het nog simpeler? Ander voorbeeld: foutafhandeling. Heel goed geregeld (nog specifiek of je read of write queries uitvoert). Als je zelf queries schrijft dan weet het framework niet wat er geschreven is en kan het daaromheen liggende proces ook niet geoptimaliseerd worden. Helaas is deze gedachte nog niet echt in de PHP wereld ingebakken, in tegenstelling tot bijvoorbeeld Microsoft met producten als Linq. Eén databaseachtige manier om met alle databronnen zoals tekstbestanden, excelbestanden, databases, xml bestanden te communiceren.
 
Pim -

Pim -

02/01/2011 21:23:36
Quote Anchor link
Complexe queries zijn niet of nauwelijks in zo'n abstractielaag uit te drukken.
Veel bronnen op internet menen dat je de ene taal niet in de andere moet mappen.

Simpele inserts zijn natuurlijk veel handiger in zo'n DBAL, veel selects niet.
 
Mark PHP

Mark PHP

02/01/2011 21:35:47
Quote Anchor link
The Force op 02/01/2011 21:17:23:
Hoezo dat dan? Door niet zelf de queries te schrijven maak je je code abstracter. Je beschrijft meer wat je wil in plaats van hoe je dat wilt.

Wat is het verschil in $query = $this->select('x')->from('y')->where('z'); en $query = "SELECT x FROM y WHERE z"? Het eerste is omslachtiger. Het is een drogreden om te denken dat het eerste simpeler is omdat de developer dan geen SQL hoeft te kennen.

Daarbij aansluitend je tweede argument, dat Active Record je query aanpast naar standaard SQL. Dit wil je vaak niet, omdat je profijt wilt hebben van de trukjes, voordelen en functies die een specifieke database je biedt. Uiteraard zul je, als je ooit wil switchen naar een andere database, je queries hier en daar aan moeten passen. Maar zolang je alle SQL in een bepaalde applicatielaag hebt, is dit een peuleschil.

The Force op 02/01/2011 21:17:23:
In een situatie waar je 0 of meer WHERE statements kan hebben moet je als je zelf de query samenstelt counters gaan bijhouden of een hack als 'WHERE 0=1 ' toepassen zodat je daarna 'OR kolom=waarde' kan doen.

Ik kan me niet echt een situatie indenken waarbij je in PHP WHERE clausules aan elkaar gaat plakken.

The Force op 02/01/2011 21:17:23:
Daarnaast dwingt Active Record automatisch veilige queries af door alles te escapen, door een XSS filter te halen enzovoorts.

Dit kan je ook afdwingen door een eigen Database klasse te schrijven, en alleen Prepared Statements toe te staan. Bovendien kan je adapters schrijven voor MySQL, PostgreSQL, Oracle enzovoort. XSS filteren doe je overigens niet als je data de database in moet, maar pas als je het aan de gebruiker presenteert.
Gewijzigd op 02/01/2011 21:37:05 door Mark PHP
 
Ozzie PHP

Ozzie PHP

02/01/2011 21:41:29
Quote Anchor link
Mark PHP op 02/01/2011 21:35:47:
The Force op 02/01/2011 21:17:23:
Hoezo dat dan? Door niet zelf de queries te schrijven maak je je code abstracter. Je beschrijft meer wat je wil in plaats van hoe je dat wilt.

Wat is het verschil in $query = $this->select('x')->from('y')->where('z'); en $query = "SELECT x FROM y WHERE z"? Het eerste is omslachtiger. Het is een drogreden om te denken dat het eerste simpeler is omdat de developer dan geen SQL hoeft te kennen.


Er is een andere reden waarom die 1e manier wel de voorkeur heeft, namelijk het automatisch aanvullen van functies waardoor je sneller een query kan schrijven, maar dit is persoonlijk natuurlijk.

Kun je die method chaining eigenlijk ook intelligent maken vraag ik me af?

Want in theorie zou je kunnen zeggen $database->select('naam')->from('gebruikers')->select('leeftijd').

Let op, in bovengenoemd voorbeeld maak ik bewust een fout door 2x select() aan te roepen. Zou je het nu ook zo kunnen maken dat zodra je seelct hebt aangeroepen je niet nogmaals select kunt aanroepen? Of kan dat niet?
Gewijzigd op 02/01/2011 21:42:12 door Ozzie PHP
 
Pim -

Pim -

02/01/2011 21:43:25
Quote Anchor link
Tuurlijk. Gewoon een parameter instellen bij select() en kijken of die al geset is.
 
Ozzie PHP

Ozzie PHP

02/01/2011 21:52:13
Quote Anchor link
uhm... ja.. maar ik bedoel het anders... Zend Studio vult bijvoorbeeld heel mooi de beschikbare functies in een class aan... maar zou het dan kunnen dat je zodra je select hebt gebruikt die functie niet meer tevoorschijn komt bij het aanvullen? Hmm... ik denk eigenlijk dat dat niet kan, tenzij je een andere class returnt.
 
Pim -

Pim -

02/01/2011 21:53:41
Quote Anchor link
Oh nee, ik zou niet je hele code veranderen omdat dat leuk werkt in je IDE...
 
Ozzie PHP

Ozzie PHP

02/01/2011 21:55:02
Quote Anchor link
Nee, maar wat ik wil kan toch ook niet denk ik??? (tenzij misschien heel omslachtig)
 
Pim -

Pim -

02/01/2011 21:56:03
Quote Anchor link
Idd. Dat wordt aardig lastig en daarmee onwenselijk.
 
Ozzie PHP

Ozzie PHP

02/01/2011 21:56:51
Quote Anchor link
oke :)

Toevoeging op 02/01/2011 22:04:05:

wat is overigens dat "lazy registreren van een object" waar Niels het eerder over had?
Gewijzigd op 02/01/2011 22:04:19 door Ozzie PHP
 
Pim -

Pim -

02/01/2011 22:11:02
Quote Anchor link
Ik neem aan dat hij het instellen (instantieren en configureren) van een object bedoelt wat pas op aanvraag gebeurt.

Dus als een registry, maar dan gebeurt er pas iets bij aanvraag en niet vooraf.

Kijk eens naar Pimple
 
Ozzie PHP

Ozzie PHP

02/01/2011 22:15:52
Quote Anchor link
Hmmm... ik vrees dat ik hier niks van ga snappen :-/
Je kunt zeker niet een heeeeeeel simpel code voorbeeldje geven zodat ik in ieder geval het principe snap? (en hopelijk ook waar je het voor kunt gebruiken)
 
The Force

The Force

02/01/2011 23:37:22
Quote Anchor link
Ozzie PHP op 02/01/2011 22:15:52:
Hmmm... ik vrees dat ik hier niks van ga snappen :-/
Je kunt zeker niet een heeeeeeel simpel code voorbeeldje geven zodat ik in ieder geval het principe snap? (en hopelijk ook waar je het voor kunt gebruiken)


Het is eigenlijk heel simpel. Je maakt een instantie van een object aan pas op het moment dat je hem nodig hebt. Zie http://dougalmatthews.com/articles/2008/apr/26/lazy-loading-in-php-with-__autoload/.
 
Ozzie PHP

Ozzie PHP

02/01/2011 23:41:54
Quote Anchor link
huh? Dat is toch gewoon de autoload functie die al eerder ter sprake is gekomen?
 
Pim -

Pim -

02/01/2011 23:47:49
 
Jelmer -

Jelmer -

02/01/2011 23:51:06
Quote Anchor link
__autoload is voor het lui inladen van classes. Wat Pim bedoelt is denk ik dat je objecten in je registery/dependency container pas gaat aanmaken wanneer je ze voor het eerst nodig hebt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

class Container
{
    private $_database;
    
    public function getDatabase()
    {

        if (!$this->_database)
            $this->_loadDatabase();
        
        return $this->_database;
    }

    
    private function _loadDatabase()
    {

        $this->_database = new PDO(...);
    }
}


$x = new Container();
// geen verbinding gemaakt.

$pdo = $x->getDatabase();
// jeej, nu nodig, dus nu een verbinding

$pdo2 = $x->getDatabase();
// verbinding is al gemaakt, kunnen we hem best hergebruiken.
?>


Maar omdat dat al snel heel veel dezelfde code wordt, is het wel prettig om iets flexibelers te hebben zoals Pimple. Of, eentje die erop lijkt en die ik zelf gebruik:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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

class DependencyContainer
{
    private $_factories = array();
    
    private $_instances = array();
    
    public function add($name, $factory)
    {

        $this->_factories[$name] = $factory;
    }

    
    public function __get($name)
    {

        if (!isset($this->_instances[$name]))
            $this->_instantiate($name);
        
        return $this->_instances[$name];
    }

    
    private function _instantiate($name)
    {

        if (!isset($this->_factories[$name]))
            throw new DependencyContainer_Exception("There is no factory for $name.");

        $instance = $this->_factories[$name]($this);

        if (is_null($instance))
            throw new DependencyContainer_Exception("Factory for $name returned NULL.");

        $this->_instances[$name] = $instance;
    }
}


class DependencyContainer_Exception extends Exception
{}

$x = new DependencyContainer();

$x->add('pdo', function($container) {
    return new PDO(...);
});


$x->add('users', function($container) {
    return new User_Store($container->pdo);
});


// Nu wordt User_Store pas ingeladen en aangemaakt, en daarvoor wordt dan PDO aangemaakt.
$x->users->find();
?>
 
Ozzie PHP

Ozzie PHP

02/01/2011 23:55:43
Quote Anchor link
Sakkerjuu... autoload... dependency injection... lazy objecten... het is me wat allemaal :)

Waarom gebruik je een underscore voor je functie- en variabelenamen?

(misschien stomme vraag, maar wat is een factory?)
 

Pagina: « vorige 1 2 3 4 5 ... 10 11 12 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.