Implementation of the PSR-7 UriInterface and PSR-17 UriFactoryInterface interfaces.
Nothing fancy. Just working. Because I need a URI implementation not hardwired to HTTP messaging. And some extras. Allow all valid schemes.
Installation
Install with Composer;
composer require phrity/net-uri
Modifiers
Out of the box, it will behave as specified by PSR standards.
To change behaviour, there are some modifiers available.
These can be added as last argument in all get
and with
methods, plus the toString
method.
REQUIRE_PORT
By PSR standard, if port is default for scheme it will be hidden. This options will attempt to always show the port. If set, it will be shown even if default. If not set, it will use default port if resolvable.
ABSOLUTE_PATH
Will cause paths to use absolute form, i.e. starting with /
.
NORMALIZE_PATH
Will attempt to normalize paths, e.g. ./a/./path/../to//something
will transform to a/to/something
.
IDNA
Will IDNA-convert host using non-ASCII characters. Only available with Intl extension.
Examples
$uri = new Uri('http://example.com');
$uri->getPort(Uri::REQUIRE_PORT); // => 80
$uri->toString(Uri::REQUIRE_PORT); // => 'http://example.com:80'
$uri = new Uri('a/./path/../to//something');
$uri->getPath(Uri::ABSOLUTE_PATH | Uri::NORMALIZE_PATH); // => '/a/to/something'
$uri->toString(Uri::ABSOLUTE_PATH | Uri::NORMALIZE_PATH); // => '/a/to/something'
$clone = $uri->withPath('path/./somewhere/else/..', Uri::ABSOLUTE_PATH | Uri::NORMALIZE_PATH);
$clone->getPath(); // => '/path/somewhere'
$uri = new Uri('https://ηßöø必Дあ.com');
$uri->getHost(Uri::IDNA); // => 'xn--zca0cg32z7rau82strvd.com'
Classes
There are two available classes, Uri
and UriFactory
.
The Uri class
class Phrity\Net\Uri implements Psr\Http\Message\UriInterface
{
// Constructor
public function __construct(string $uri_string = '');
// PSR-7 getters
public function getScheme(int $flags = 0): string;
public function getAuthority(int $flags = 0): string;
public function getUserInfo(int $flags = 0): string;
public function getHost(int $flags = 0): string;
public function getPort(int $flags = 0): ?int;
public function getPath(int $flags = 0): string;
public function getQuery(int $flags = 0): string;
public function getFragment(int $flags = 0): string;
// PSR-7 setters
public function withScheme($scheme, int $flags = 0): UriInterface;
public function withUserInfo($user, $password = null, int $flags = 0): UriInterface;
public function withHost($host, int $flags = 0): UriInterface;
public function withPort($port, int $flags = 0): UriInterface;
public function withPath($path, int $flags = 0): UriInterface;
public function withQuery($query, int $flags = 0): UriInterface;
public function withFragment($fragment, int $flags = 0): UriInterface;
// PSR-7 string representation
public function __toString(): string;
// Additional methods
public function toString(int $flags = 0): string;
}
The UriFactory class
class Phrity\Net\UriFactory implements Psr\Http\Message\UriFactoryInterface
{
// Constructor
public function __construct();
// PSR-17 factory
public function createUri(string $uri = ''): UriInterface;
}
Versions
Version | PHP | |
---|---|---|
1.3 |
^7.4|^8.0 |
|
1.2 |
^7.4|^8.0 |
IDNA modifier |
1.1 |
^7.4|^8.0 |
Require port, Absolute path, Normalize path modifiers |
1.0 |
^7.4|^8.0 |
Initial version |