byjg / uri
An implementation of PSR-7 Uri Interface
Fund package maintenance!
byjg
Installs: 526 415
Dependents: 3
Suggesters: 0
Security: 0
Stars: 3
Watchers: 1
Forks: 4
Open Issues: 0
Type:project
pkg:composer/byjg/uri
Requires
- php: >=8.1 <8.5
- psr/http-message: ^1.0|^1.1|^2.0
Requires (Dev)
- phpunit/phpunit: ^9.6
- vimeo/psalm: ^6.0
Provides
README
Uri class
A PHP implementation of PSR-7 UriInterface with additional utility methods.
Features
- Fully compliant with PSR-7 UriInterface
- Includes additional utility methods via CustomUriInterface
- Supports RFC3986 URI specification
- Type-safe implementation with PHP 8 attributes and strict typing
- Immutable class design pattern
URI Encoding Behavior
PSR-7 requires URI compliant with RFC3986. This means the URI output will always be URL encoded. This applies to both creating a new instance and the string representation.
Examples:
// Creating a URI with special characters in the password $uri = \ByJG\Util\Uri::getInstance("https://user:pa&@host"); print((string)$uri); // Will print "https://user:pa%26@host" // Creating a URI with already encoded characters $uri = \ByJG\Util\Uri::getInstance("https://user:pa%26@host"); print((string)$uri); // Will print "https://user:pa%26@host" // Using withUserInfo with unencoded password $uri = \ByJG\Util\Uri::getInstance("https://host") ->withUserInfo("user", "pa&"); print((string)$uri); // Will print "https://user:pa&@host" // Using withUserInfo with already encoded password $uri = \ByJG\Util\Uri::getInstance("https://host") ->withUserInfo("user", "pa%26"); print((string)$uri); // Will print "https://user:pa%2526@host"
Additional Methods
This implementation extends PSR-7 UriInterface with the following additional methods through \ByJG\Util\CustomUriInterface:
| Method | Description |
|---|---|
getUsername(): ?string |
Get the username component of the URI |
getPassword(): ?string |
Get the password component of the URI |
getQueryPart(string $key): ?string |
Get a specific query parameter by key |
withQueryKeyValue(string $key, string $value, bool $isEncoded = false): self |
Add or update a query parameter |
hasQueryKey(string $key): bool |
Check if a query parameter exists |
Static Factory Methods
The class provides convenient static factory methods:
// Create from string $uri = Uri::getInstance("https://example.com/path?query=value#fragment"); // Create from another UriInterface $uri2 = Uri::getInstance($uri);
Documentation
Install
composer require "byjg/uri"
Unit tests
vendor/bin/phpunit
Dependencies
flowchart TD
byjg/uri --> psr/http-message
Loading