public function constructUrl(Request $appRequest, Url $refUrl)
{
// Module prefix not match.
if ($this->module && !Strings::startsWith($appRequest->getPresenterName(), $this->module)) {
return NULL;
}
$parameters = $appRequest->getParameters();
$url = $refUrl->getBaseUrl();
$urlStack = [];
// Module prefix.
$moduleFrags = explode(":", $appRequest->getPresenterName());
$moduleFrags = array_map('\\AdamStipak\\Support\\Inflector::spinalCase', $moduleFrags);
$resourceName = array_pop($moduleFrags);
$urlStack += $moduleFrags;
// Associations.
if (isset($parameters['associations']) && Validators::is($parameters['associations'], 'array')) {
$associations = $parameters['associations'];
unset($parameters['associations']);
foreach ($associations as $key => $value) {
$urlStack[] = $key;
$urlStack[] = $value;
}
}
// Resource.
$urlStack[] = $resourceName;
// Id.
if (isset($parameters['id']) && Validators::is($parameters['id'], 'scalar')) {
$urlStack[] = $parameters['id'];
unset($parameters['id']);
}
$url = $url . implode('/', $urlStack);
$sep = ini_get('arg_separator.input');
if (isset($parameters['query'])) {
$query = http_build_query($parameters['query'], '', $sep ? $sep[0] : '&');
if ($query != '') {
$url .= '?' . $query;
}
}
return $url;
}