maximebf / atomik

Micro framework for PHP 5.3+ [UNMAINTAINED]
MIT License
46 stars 18 forks source link

Can't get parameters' default value to work #33

Open zessx opened 10 years ago

zessx commented 10 years ago

I'm trying to bind those url to the same route :

I used default values for my :year parameter, as defined in documentation :

'app' => array(
    'routes' => array(
        'posts/:year' => array(
            '@name' => 'posts',
            'action' => 'posts/index',
            'year' => 'all',
        ),
    ),
),

Here are the results :

Build url Result
Atomik::url('@posts', array('year'=>2014)) domain.tld/posts/2014
Atomik::url('@posts') domain.tld/posts/:year

How could we remove this unused/unusable /:year from the url ?
We should :

I made an attempt to get it work (see this fork) :

// injects parameters into the url
if (preg_match_all('/(:([a-z0-9_]+))/i', $action, $matches)) {
    for ($i = 0, $c = count($matches[0]); $i < $c; $i++) {
        if (array_key_exists($matches[2][$i], $params)) {
            $action = str_replace($matches[1][$i], $params[$matches[2][$i]], $action);
            unset($params[$matches[2][$i]]);
        } elseif (array_key_exists($matches[2][$i], $default)) {
            // default value is found, remove he related part from url
            $action = preg_replace('/:'.$matches[2][$i].'\/?/i', '', $action);
        }
    }
}

Currently, it remove /:year from the url, but the action file doesn't receive any year default value.
As possible side-effects, we must think about people using Atomik without url-rewriting.

adaniello commented 10 years ago

This is a very interesting topic: i was forced to specify the default values ​​of the parameters every time i created a url. I hope Maxime can help us to find a solution in the short.