<?php
namespace Poirot\Router
{
use Poirot\Router\Interfaces\iRoute;
use Poirot\Std\Interfaces\Struct\iData;
use Poirot\Std\Type\StdArray;
/**
* Merge given params with route defaults
* @param iRoute $route
* @param array|\Traversable $params
*/
function mergeParamsIntoRouter(iRoute $route, $params)
{
mergeParams($route->params(), $params);
}
/**
* Merge Params
*
* @param iData $params
* @param array|\Traversable $paramsToMerge
* @param bool $recursive
* When parameters exactly given on assemble or something,
* we don't need merge recursively and instead replace items
*/
function mergeParams(iData $params, $paramsToMerge, $recursive = true)
{
if ($paramsToMerge instanceof \Traversable)
$paramsToMerge = \Poirot\Std\cast($paramsToMerge)->toArray();
if (!is_array($paramsToMerge))
throw new \InvalidArgumentException(sprintf(
'Parameters must be an array or instance of Traversable; given: (%s).'
, \Poirot\Std\flatten($paramsToMerge)
));
if (! empty($paramsToMerge) ) {
// note: we use route params merge to execute chained action on route match
// and for this index(priority) of actions in list params in mandatory
// the first route param first then children param after that
if ($recursive) {
// Merge Recursive because may have chained Actions.
$paramsToMerge = new StdArray($paramsToMerge);
$merged = new StdArray( \Poirot\Std\cast($params)->toArray() );
$paramsToMerge = $merged->withMergeRecursive($paramsToMerge, false);
}
$params->import($paramsToMerge);
}
}
function encodeUrl($value)
{
return rawurlencode($value);
}
function decodeUrl($value)
{
return rawurldecode($value);
}
}
|