Hallo,

Ik heb een eigen router class in php gemaakt. De router class include ik op de index.php waar ik ook alle routes toevoeg. Bijvoorbeeld zo <?php $route->add('/product/\d+', function(){ require_once 'pages/product.php' }) ?>

Ook heb ik een Model class voor al mijn database queries. Zoals in de code te zien, zie je dat ik het model object aanroep. Hoe kan het dat als ik het model object oproep doormiddel van <?php $model = new Model(); ?> Dat ik de $model variabel niet kan gebruiken in bijvoorbeeld een bestand wat ik met die router functie require?

<?php
require_once 'classes/route.php';
require_once 'classes/config.php';
require_once 'classes/model.php';
require_once 'functions.php';
require_once 'classes/validator.php';

$route = new Route();
$db = new Db();
$model = new Model();

$route->add('/', function(){
require_once 'pages/home.php';
});

$route->add('/tapijten', function(){
require_once 'pages/products.php';
});

$route->add('/product/\d+', function($model){
require_once 'pages/product.php';
});

$route->add('/contact', function(){
require_once 'pages/contact.php';
});

$route->add('/admin', function(){
require_once 'pages/admin.php';
});

$route->add('/login', function(){
require_once 'pages/test.php';
});

$route->submit();
?>

In de product.php wat ik dus require in de index.php wil ik een query oproepen doormiddel van het $model variabel.
<?php
require_once 'inc/header.php';
$uri = $_SERVER['REQUEST_URI'];
$pin = explode('/', $uri);
$id = $pin[3];

$product = $model->selectById($id, 'carpet');
$product = $product->fetch(PDO::FETCH_ASSOC);
?> Het werkt alleen als ik bijvoorbeeld $model = new Model(); opnieuw aanroep. Wat ik dus gek vind omdat ik dat dus al in het hoofd bestand doe.
En waar in je andere thread is er ondersteuning voor objecten in de callbackfunctie? Noch in de add() methode noch in call_user_func() in de submit() methode worden parameters doorgegeven? In die code zit waarschijnlijk ergens de fout.

De $params in @Robs code hebben betrekking op de matches van URI's en hebben dus (?) volgens mij niets te maken met de "object parameters" die jij probeert door te geven.

Weet je ook zeker dat de juiste methode wordt uitgevoerd?
@Thomas: in die vorige thread kun je aan de add() een string meegeven die dan in de afhandeling als class naam wordt gezien (zie regel 30 in mijn versie).

Wat je hier doet met /products klopt dus niet. De callback functie krijgt de matches uit de regex mee. Het feit dat je de parameter van de callback functie $model noemt betekent niet dat dat die $model van regel 10 is. Wil je het $model wel in de callback gebruiken, dan zul je 'm met 'use' mee moeten geven.

De params die ik in mijn aangepaste stukje code doorgeef aan de constructor komen uit de preg_match(). Wil je dat daar iets zinnigs in zit, dan zul je in de reg-ex groepering toe moeten passen (met haakjes):

$route->add('/product/(\d+)', function($params) use ($model){
  //het ID zit nu in $params[1]
  //$model bevat nu het op regel 10 aangemaakte Model
  require_once 'pages/product.php';
});
Het eerste $product is een ander $product dan het tweede $product:

<?php
$product = $model->selectById($id, 'carpet');
$product = $product->fetch(PDO::FETCH_ASSOC);
?>


Is $product zelf trouwens geen model en $model dan meer een mapper?

En waarom accepteert de selectById() niet alleen een $id maar ook de stirng 'carpet'? Die methode doet kennelijk twee verschillende dingen.


<?php
$db = new Db();
$model = new Model();
?>

Er is ergens een $db in omloop, maar waar komt die dan terug in je code?
Je lijkt in $product->fetch(PDO::FETCH_ASSOC) PDO te gebruiken, maar waar is dan de $db gebleven?
Als je in PHP een bestand included dan moet je dat zien als een tekst bewerking.

voorbeeld:

index.php:
<?php
function something() {
require 'routes.php';
}

something();
?>

routes.php:
<?php
$routes = 'blabla';
?>

Is het zelfde als:
<?php
function something() {
$routes = 'blabla';
}

something();
?>

De kneep zit m in het feit dat de variabele $routes dus aangemaakt wordt in de functie something. Deze variabele bestaat dus ook enkel en alleen binnen de functie something en niet er buiten.
Ik dacht simpelweg dat als ik een variabel aanmaak in het hoofdbestand index.php dat hij dan gewoon te gebruiken is in een ander bestand dat wordt geinclude op de index.php omdat hij dan technisch gezien nog steeds op de index.php wordt geprint alleen dan tussen de html van het geinclude bestand.
Het gaat er dus om dat de variabele $routes binnen een function staat, wat inhoudt dat die variabele daarbuiten niet bekend is.

Reageren