AdamStipak\RestRoute::constructUrl PHP Method

constructUrl() public method

Constructs absolute URL from Request object.
public constructUrl ( Nette\Application\Request $appRequest, Url $refUrl ) : string | null
$appRequest Nette\Application\Request
$refUrl Nette\Http\Url
return string | null
    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;
    }

Usage Example

 public function testMatchAndConstructSpinalCaseUrlMultipleResource()
 {
     $route = new RestRoute();
     $url = new UrlScript('http://localhost');
     $url->setPath('/first-level/123/second-level/456/re-source');
     $request = new Request($url, NULL, NULL, NULL, NULL, NULL, 'GET');
     $appRequest = $route->match($request);
     $expectedPresenterName = 'ReSource';
     $this->assertEquals($expectedPresenterName, $appRequest->getPresenterName());
     $refUrl = new Url('http://localhost');
     $url = $route->constructUrl($appRequest, $refUrl);
     $expectedUrl = 'http://localhost/first-level/123/second-level/456/re-source';
     $this->assertEquals($expectedUrl, $url);
 }
All Usage Examples Of AdamStipak\RestRoute::constructUrl