PHPackages                             uri-interop/interface - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. uri-interop/interface

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

uri-interop/interface
=====================

Interoperable URI interfaces for PHP.

1.0.1(3mo ago)6812MITPHPPHP &gt;=8.4CI passing

Since Mar 9Pushed 3mo ago2 watchersCompare

[ Source](https://github.com/uri-interop/interface)[ Packagist](https://packagist.org/packages/uri-interop/interface)[ Docs](https://github.com/uri-interop/interface)[ RSS](/packages/uri-interop-interface/feed)WikiDiscussions 1.x Synced 1w ago

READMEChangelog (10)Dependencies (9)Versions (10)Used By (2)

Uri-Interop Standard Interface Package
======================================

[](#uri-interop-standard-interface-package)

[![PDS Skeleton](https://camo.githubusercontent.com/50d01a5094afcc3a827c3cadaec43d23b2a256cb249f5fdd6e5ffdb53ea7971c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7064732d736b656c65746f6e2d626c75652e7376673f7374796c653d666c61742d737175617265)](https://github.com/php-pds/skeleton)[![PDS Composer Script Names](https://camo.githubusercontent.com/0c17df07fd0a51ad878f1de0d4c17ea8e460f2e96ce796c8cd58e6c96ed9c08d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7064732d636f6d706f7365722d2d7363726970742d2d6e616d65732d626c75653f7374796c653d666c61742d737175617265)](https://github.com/php-pds/composer-script-names)

Uri-Interop provides an interoperable package of standard interfaces for working with URIs in PHP 8.4 or later. It reflects, refines, and reconciles the common practices identified within [several pre-existing projects](./README-RESEARCH.md).

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/info/bcp14) ([RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119), [RFC 8174](https://datatracker.ietf.org/doc/html/rfc8174)).

This package attempts to adhere to the [Package Development Standards](https://php-pds.com/) approach to [naming and versioning](https://php-pds.com/#naming-and-versioning).

Interfaces
----------

[](#interfaces)

This package defines the following interfaces:

- [*UriStruct*](#uristruct) affords reading of URI component values and recomposing them into a string.
- [*MutableUriStruct*](#mutableuristruct) extends [*UriStruct*](#uristruct) to afford direct modification of component values via property set hooks.
- [*ImmutableUriStruct*](#immutableuristruct) extends [*UriStruct*](#uristruct) to afford immutable modification of component values via "with" methods.
- [*UriStructFactory*](#uristructfactory) affords creating a new [*UriStruct*](#uristruct) instance from parsed component values.
- [*UriStructNormalizer*](#uristructnormalizer) affords creating a [*UriStruct*](#uristruct) instance with [normalized component values](https://datatracker.ietf.org/doc/html/rfc3986/#section-6).
- [*UriStructResolver*](#uristructresolver) affords creating a new [*UriStruct*](#uristruct) instance by resolving a relative URI reference against a base URI.
- [*UriStringParser*](#uristringparser) affords creating a new [*UriStruct*](#uristruct) instance from a URI string.
- [*UriThrowable*](#urithrowable) is a marker interface that extends [*Throwable*](https://php.net/Throwable) to indicate an [*Exception*](https://php.net/Exception) is URI-related.
- [*UriTypeAliases*](#uritypealiases) provides custom PHPStan types to aid static analysis.

### *UriStruct*

[](#uristruct)

[*UriStruct*](#uristruct) affords reading of URI component values and recomposing them into a string.

- Directives:

    - Implementations MAY sanitize component values (e.g. by applying [`trim()`](https://php.net/trim)).
    - Implementations MAY [normalize component values](https://datatracker.ietf.org/doc/html/rfc3986/#section-6).
    - Implementations MAY validate component values; implementations doing so MUST throw a [*UriThrowable*](#urithrowable) when a component value is invalid.
- Notes:

    - **These are property get hooks, not getter methods.** The property values are straightforward and require little-to-no logic around getting in most cases. Further, use of the `$queryParams` property looks more like idiomatic PHP; e.g., `$uri->queryParams['foo'] ?? 'bar'`and not `$uri->queryParams()['foo']` or `$uri->queryParams('foo', 'bar')`.
    - **Most component values are nullable.** This preserves the distinction between the state of a component that is present but empty (e.g. as by an empty string) and that of a component not being present at all (represented by `null`). Note that `$path` is always considered present (though it may be empty).
    - **The query component is a `composed_string`.** Emulating a form submission might require using form-url-encoded values, so the query component may be composed of form-url-encoded values or percent-encoded values.

#### *UriStruct* Properties

[](#uristruct-properties)

- ```
    public ?string $scheme { get; }
    ```

    - The scheme component value (e.g., `https` or `urn`); does not include the `:` separator.
    - Directives:

        - Implementations MUST report this value as `null` if the scheme component is not present.
- ```
    public ?percent_encoded_string $username { get; }
    ```

    - The username component value.
    - Directives:

        - Implementations MUST report this value as `null` if the username component is not present.
- ```
    public ?percent_encoded_string $password { get; }
    ```

    - The password component value.
    - Directives:

        - Implementations MUST report this value as `null` if the password component is not present.
- ```
    public ?percent_composed_string $host { get; }
    ```

    - The host component value (e.g. `www.example.net`, `127.0.0.1`, `[::1]`, and so on).
    - Directives:

        - Implementations MUST report this value as `null` if the host component is not present.
- ```
    public ?int $port { get; }
    ```

    - The port component value (e.g. `443`).
    - Directives:

        - Implementations MUST report this value as `null` if the port component is not present.
- ```
    public percent_composed_string $path { get; }
    ```

    - The path component value (e.g. `/path/to/page.html`, `ietf:rfc:3986`, `username@example.net`, and so on).
- ```
    public ?composed_string $query { get; }
    ```

    - The query component value (e.g. `foo=bar&baz=qux`); does not include the `?` separator.
    - Directives:

        - Implementations MUST report this value as `null` if the query component is not present.
- ```
    public ?percent_composed_string $fragment { get; }
    ```

    - The fragment component value; does not include the `#` separator.
    - Directives:

        - Implementations MUST report this value as `null` if the fragment component is not present.
- ```
    public ?query_params_array $queryParams { get; }
    ```

    - The query component value represented as an associative array.
    - Directives:

        - Implementations MUST report this value as `null` if the query component is not present.
- ```
    public ?percent_composed_string $userinfo { get; }
    ```

    - The recomposed `$username` and `$password`; does not include the `@`separator.
    - Directives:

        - Implementations MUST report this value as `null` if both `$username` and `$password` are `null`.
- ```
    public ?percent_composed_string $authority { get; }
    ```

    - The recomposed `$userinfo`, `$host`, and `$port`; does not include the `//` separator.
    - Directives:

        - Implementations MUST report this value as `null` if `$userinfo`, `$host`, and `$port` are all `null`.

#### *UriStruct* Methods

[](#uristruct-methods)

- ```
    public function __toString() : composed_string;
    ```

    - Composes the component values into a full URI string.

### *MutableUriStruct*

[](#mutableuristruct)

[*MutableUriStruct*](#mutableuristruct) extends [*UriStruct*](#uristruct) to afford direct modification of component values via property set hooks.

- Directives:

    - Implementations MUST keep `$query` and `$queryParams` in sync; if one is modified, the other MUST be modified accordingly.
- Notes:

    - **These are property set hooks, not setter methods.** The property values are straightforward and require little-to-no logic around setting in most cases.
    - **There are no property set hooks for `$userinfo` or `$authority`.**Because these are combined from other component values, they are not modified directly.

#### *MutableUriStruct* Properties

[](#mutableuristruct-properties)

- ```
    public ?string $scheme { get; set; }
    ```

    - The scheme component value (e.g., `https` or `urn`); does not include the `:` separator.
    - Directives:

        - Implementations MUST report this value as `null` if the scheme component is not present.
- ```
    public ?percent_encoded_string $username { get; set; }
    ```

    - The username component value.
    - Directives:

        - Implementations MUST report this value as `null` if the username component is not present.
- ```
    public ?percent_encoded_string $password { get; set; }
    ```

    - The password component value.
    - Directives:

        - Implementations MUST report this value as `null` if the password component is not present.
- ```
    public ?percent_composed_string $host { get; set; }
    ```

    - The host component value (e.g. `www.example.net`, `127.0.0.1`, `[::1]`, and so on).
    - Directives:

        - Implementations MUST report this value as `null` if the host component is not present.
- ```
    public ?int $port { get; set; }
    ```

    - The port component value (e.g. `443`).
    - Directives:

        - Implementations MUST report this value as `null` if the port component is not present.
- ```
    public percent_composed_string $path { get; set; }
    ```

    - The path component value (e.g. `/path/to/page.html`, `ietf:rfc:3986`, `username@example.net`, and so on).
- ```
    public ?composed_string $query { get; set; }
    ```

    - The query component value (e.g. `foo=bar&baz=qux`); does not include the `?` separator.
    - Directives:

        - Implementations MUST report this value as `null` if the query component is not present.
- ```
    public ?percent_composed_string $fragment { get; set; }
    ```

    - The fragment component value; does not include the `#` separator.
    - Directives:

        - Implementations MUST report this value as `null` if the fragment component is not present.
- ```
    public ?query_params_array $queryParams { get; set; }
    ```

    - The query component value represented as an associative array.
    - Directives:

        - Implementations MUST report this value as `null` if the query component is not present.

### *ImmutableUriStruct*

[](#immutableuristruct)

[*ImmutableUriStruct*](#immutableuristruct) extends [*UriStruct*](#uristruct) to afford immutable modification of component values via "with" methods.

- Notes:

    - **There are no methods for `withUserInfo()` or `withAuthority()`.**Because these are combined from other property values, they are not modified directly.

#### *ImmutableUriStruct* Methods

[](#immutableuristruct-methods)

- ```
    public function withScheme(?string $scheme) : ImmutableUriStruct;
    ```

    - Returns a new instance of the [*ImmutableUriStruct*](#immutableuristruct) with the modified `$scheme` value.
- ```
    public function withUsername(
        ?percent_encoded_string $username,
    ) : ImmutableUriStruct;
    ```

    - Returns a new instance of the [*ImmutableUriStruct*](#immutableuristruct) with the modified `$username` value.
- ```
    public function withPassword(
        ?percent_encoded_string $password,
    ) : ImmutableUriStruct;
    ```

    - Returns a new instance of the [*ImmutableUriStruct*](#immutableuristruct) with the modified `$password` value.
- ```
    public function withHost(?percent_composed_string $host) : ImmutableUriStruct;
    ```

    - Returns a new instance of the [*ImmutableUriStruct*](#immutableuristruct) with the modified `$host` value.
- ```
    public function withPort(?int $port) : ImmutableUriStruct;
    ```

    - Returns a new instance of the [*ImmutableUriStruct*](#immutableuristruct) with the modified `$port` value.
- ```
    public function withPath(percent_composed_string $path) : ImmutableUriStruct;
    ```

    - Returns a new instance of the [*ImmutableUriStruct*](#immutableuristruct) with the modified `$path` value.
- ```
    public function withQuery(?composed_string $query) : ImmutableUriStruct;
    ```

    - Returns a new instance of the [*ImmutableUriStruct*](#immutableuristruct) with the modified `$query` value.
    - Directives:

        - Implementations MUST keep `$query` and `$queryParams` in sync; if one is modified, the other MUST be modified accordingly.
- ```
    public function withFragment(
        ?percent_composed_string $fragment,
    ) : ImmutableUriStruct;
    ```

    - Returns a new instance of the [*ImmutableUriStruct*](#immutableuristruct) with the modified `$fragment` value.
- ```
    public function withQueryParams(
        ?query_params_array $queryParams,
    ) : ImmutableUriStruct;
    ```

    - Returns a new instance of the [*ImmutableUriStruct*](#immutableuristruct) with the modified `$queryParams` value.
    - Directives:

        - Implementations MUST keep `$query` and `$queryParams` in sync; if one is modified, the other MUST be modified accordingly.

### *UriStructFactory*

[](#uristructfactory)

[*UriStructFactory*](#uristructfactory) affords creating a new [*UriStruct*](#uristruct) instance from parsed component values.

#### *UriStructFactory* Methods

[](#uristructfactory-methods)

- ```
    public function newUri(
        ?string $scheme = null,
        ?percent_encoded_string $username = null,
        ?percent_encoded_string $password = null,
        ?percent_composed_string $host = null,
        ?int $port = null,
        percent_composed_string $path = '',
        ?composed_string $query = null,
        ?percent_composed_string $fragment = null,
    ) : UriStruct;
    ```

    - Creates a new [*UriStruct*](#uristruct) instance from the given component values.

### *UriStructNormalizer*

[](#uristructnormalizer)

[*UriStructNormalizer*](#uristructnormalizer) affords creating a [*UriStruct*](#uristruct) instance with [normalized component values](https://datatracker.ietf.org/doc/html/rfc3986/#section-6).

#### *UriStructNormalizer* Methods

[](#uristructnormalizer-methods)

- ```
    public function normalizeUri(UriStruct $uri) : UriStruct;
    ```

    - Returns a new [*UriStruct*](#uristruct) instance with normalized component values.
    - Directives:

        - Implementations MUST apply [syntax-based normalization](https://datatracker.ietf.org/doc/html/rfc3986/#section-6.2.2) and MAY apply one or more additional normalizations (e.g. [scheme-based normalization](https://datatracker.ietf.org/doc/html/rfc3986/#section-6.2.3) or [protocol-based normalization](https://datatracker.ietf.org/doc/html/rfc3986/#section-6.2.4)).
        - Implementations MUST return a new instance of [*UriStruct*](#uristruct).

### *UriStructResolver*

[](#uristructresolver)

[*UriStructResolver*](#uristructresolver) affords creating a new [*UriStruct*](#uristruct) instance by resolving a relative URI reference against a base URI.

#### *UriStructResolver* Methods

[](#uristructresolver-methods)

- ```
    public function resolveUri(UriStruct $base, UriStruct $relative) : UriStruct;
    ```

    - Returns a new [*UriStruct*](#uristruct) instance representing `$relative`resolved against `$base`.
    - Directives:

        - Implementations MUST apply the algorithm described in [RFC 3986 Relative Resolution](https://datatracker.ietf.org/doc/html/rfc3986/#section-5.2).
        - Implementations MUST return a new instance of [*UriStruct*](#uristruct).
        - Implementations MAY [normalize component values](https://datatracker.ietf.org/doc/html/rfc3986/#section-6) in the returned instance (e.g. by applying [syntax-based normalization](https://datatracker.ietf.org/doc/html/rfc3986/#section-6.2.2), [scheme-based normalization](https://datatracker.ietf.org/doc/html/rfc3986/#section-6.2.3), [protocol-based normalization](https://datatracker.ietf.org/doc/html/rfc3986/#section-6.2.4), etc.).

### *UriStringParser*

[](#uristringparser)

[*UriStringParser*](#uristringparser) affords creating a new [*UriStruct*](#uristruct) instance from a URI string.

- Directives:

    - Implementations SHOULD use the [RFC 3986 parsing algorithm](https://datatracker.ietf.org/doc/html/rfc3986/#appendix-B).
- Notes:

    - **The parser returns a new [*UriStruct*](#uristruct) instance instead of an array of component values.** This reduces the number of steps involved in creating a new instance.
    - **The native [`parse_url()`](https://php.net/parse_url) PHP function is not strictly [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986/) compliant.** Using [`parse_url()`](https://php.net/parse_url) may be fine for many cases, but implementations should consider using the [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986/)-compliant approach instead.

#### *UriStringParser* Methods

[](#uristringparser-methods)

- ```
    public function parseUri(string|Stringable $uriString) : UriStruct;
    ```

    - Returns a new [*UriStruct*](#uristruct) instance parsed from the given URI string.

### *UriThrowable*

[](#urithrowable)

[*UriThrowable*](#urithrowable) is a marker interface that extends [*Throwable*](https://php.net/Throwable) to indicate an [*Exception*](https://php.net/Exception) is URI-related.

It adds no class members.

### *UriTypeAliases*

[](#uritypealiases)

[*UriTypeAliases*](#uritypealiases) provides custom PHPStan types to aid static analysis.

- `composed_string`

    - A concatenation of `encoded_string`s with component-appropriate `string` delimiters.
- `decoded_string`

    - The result of decoding an `encoded_string`.
- `encoded_string`

    - A `formurl_encoded_string` or `percent_encoded_string`.
- `formurl_composed_string`

    - A concatenation of `formurl_encoded_string`s with component-appropriate `string` delimiters.
- `formurl_encoded_string`

    - An `application/x-www-form-urlencoded` string, with `+` for the space character.
- ```
    parse_url_array array{
        scheme?:string,
        user?:string,
        pass?:string,
        host?:string,
        port?:?int,
        path?:string,
        query?:string,
        fragment?:string
    }

    ```

    - The array return from [`parse_url()`](https://php.net/parse_url).
- `percent_composed_string`

    - A concatenation of `percent_encoded_string`s with component-appropriate `string` delimiters.
- `percent_encoded_string`

    - A percent-encoded string, with `%20` for the space character.
- `query_params_array`

    - An associative array of up to 16 dimensions with `decoded_string` keys and `decoded_string` values.
- Notes:

    - **Native PHP functions will suffice for the type aliases.**Implementations may provide their own alternative functionality.

        - [`http_build_query()`](https://php.net/http_build_query) with `encoding_type: PHP_QUERY_1738` will encode each space character as `+`, returning a `formurl_encoded_string`.
        - [`http_build_query()`](https://php.net/http_build_query) with `encoding_type: PHP_QUERY_3986` will encode each space character as `%20`, returning a `percent_encoded_string`.
        - [`parse_str()`](https://php.net/parse_str) will decode both `+` and `%20` to a space character, returning a `query_params_array`.
        - [`rawurlencode()`](https://php.net/rawurlencode) will encode each space character as `%20`, returning a `percent_encoded_string`.
        - [`urldecode()`](https://php.net/urldecode) will decode both `+` and `%20` to a space character, returning a `decoded_string`.
        - [`urlencode()`](https://php.net/urlencode) will encode each space character as `+`, returning a `formurl_encoded_string`.
    - **The `*_[00-0F]` types are to enable limited recursion.** PHPStan does not handle recursive type aliases, so `query_params_array`cannot ever refer back to itself. As a result, that type alias refers to the `*_[00-0F]` types to enable recursion to 16 dimensions. Consumers need not use these recursion-enabling type aliases.

Implementations
---------------

[](#implementations)

Implementations advertised as readonly or immutable MUST be deeply readonly or immutable; they MUST NOT encapsulate any references, resources, mutable objects, objects or arrays encapsulating references or resources or mutable objects, and so on.

Implementations MAY define additional class members not defined in these interfaces; implementations advertised as readonly or immutable MUST make those additional class members deeply readonly or immutable.

Notes:

- **Reflection does not invalidate advertisements of readonly or immutable implementations.** The ability of a consumer to use Reflection to mutate an implementation advertised as readonly or immutable does not constitute a failure to comply with Uri-Interop.
- **Reference implementations** are available at .

Q &amp; A
---------

[](#q--a)

### Why `$username` and not `$user`?

[](#why-username-and-not-user)

Among the researched projects, `$user` was the more common property name. Earlier drafts honored the majority. However, for symmetry with `$password` and `$userinfo`, reviewers found `$username` more suitable. The fact that [WHATWG-URL](https://url.spec.whatwg.org/) specifies `username` strengthened that preference.

### Why `$password` and not `$pass`?

[](#why-password-and-not-pass)

Among the researched projects, `$password` was the more common property name.

### Why `$userinfo` (lower case) and not `$userInfo` (camel case)?

[](#why-userinfo-lower-case-and-not-userinfo-camel-case)

Among the researched projects, most used camel-casing for this property and/or its associated methods, rather than all lower case. Earlier drafts honored this majority usage. However, for symmetry with `$username` and `$password`, reviewers found `$userinfo` more suitable.

### Why is RFC 3987 not included?

[](#why-is-rfc-3987-not-included)

Earlier drafts of these standard interfaces included an [RFC 3987](https://datatracker.ietf.org/doc/html/rfc3987/) marker interface for IRIs, in an attempt to unify IRI and URI handling. In the end it was removed:

1. There are too few IRI implementations to draw from.
2. Tooling around percent-encoding for UCS characters is practically nonexistent.
3. Percent-encoding strategies around ASCII-only URIs as vs UCS-allowed IRIs were difficult to typehint sensibly.

Despite this, [RFC 3987](https://datatracker.ietf.org/doc/html/rfc3987/) projects do have some overlap with URIs, and thus continue to inform Uri-Interop.

### Why is WHATWG-URL not included?

[](#why-is-whatwg-url-not-included)

Earlier drafts of these standard interfaces included a [WHATWG-URL](https://url.spec.whatwg.org/) marker. However, there are enough differences between [WHATWG-URL](https://url.spec.whatwg.org/) and the [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986/)-like behaviors of the researched projects to warrant exclusion from this standard.

Despite this, [WHATWG-URL](https://url.spec.whatwg.org/) does have some overlap with [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986/), and thus continues to inform Uri-Interop.

### Why is there no `UriStruct::normalize()` interface method?

[](#why-is-there-no-uristructnormalize-interface-method)

Although a [*UriStructNormalizer*](#uristructnormalizer) is provided to afford normalizing any [*UriStruct*](#uristruct), there is no interface that affords something like a `normalize()` method directly on a [*UriStruct*](#uristruct). Reviewers preferred being able to specify normalization logic independent from any particular [*UriStruct*](#uristruct) implementation, especially when normalizing URIs from different implementors to compare them for equivalence.

### Why is there no `UriStruct::resolve()` interface method?

[](#why-is-there-no-uristructresolve-interface-method)

Although a [*UriStructResolver*](#uristructresolver) is provided to afford resolving relative URI references, there is no interface that affords something like a `resolve()` method directly on a [*UriStruct*](#uristruct). As with normalization, reviewers preferred being able to specify resolution logic independent from any particular [*UriStruct*](#uristruct) implementation.

---

###  Health Score

45

—

FairBetter than 91% of packages

Maintenance80

Actively maintained with recent releases

Popularity16

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~55 days

Recently: every ~109 days

Total

10

Last Release

23d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/25754?v=4)[Paul M. Jones](/maintainers/pmjones)[@pmjones](https://github.com/pmjones)

---

Top Contributors

[![pmjones](https://avatars.githubusercontent.com/u/25754?v=4)](https://github.com/pmjones "pmjones (59 commits)")

---

Tags

urirfc3986RFC 3986

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/uri-interop-interface/health.svg)

```
[![Health](https://phpackages.com/badges/uri-interop-interface/health.svg)](https://phpackages.com/packages/uri-interop-interface)
```

###  Alternatives

[league/uri-components

URI components manipulation library

32044.0M106](/packages/league-uri-components)[sabre/uri

Functions for making sense out of URIs.

29638.6M46](/packages/sabre-uri)[laminas/laminas-uri

A component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)

3838.6M106](/packages/laminas-laminas-uri)[cybercog/laravel-optimus

An Optimus bridge for Laravel. Id obfuscation based on Knuth's multiplicative hashing method.

193583.0k](/packages/cybercog-laravel-optimus)[opis/uri

Build, parse and validate URIs and URI-templates

2128.8M8](/packages/opis-uri)[ml/iri

IRI handling for PHP

267.4M6](/packages/ml-iri)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
