Olá pessoal, tudo bem?!

Para um programador é uma tarefa muito corriqueira manipular ou validar URI. E para facilitar essa tarefa iremos aprender a utilizar o componente Zend-URI,  ferramenta fantástica e simples, que irá agilizar nosso dia a dia.

Uma breve descrição do que é URI (Uniform Resource Identifier), sendo uma cadeia de caracteres utilizada para identificar ou denominar um recurso na internet.

Não vamos utilizar um ZF Skeleton, vamos aprender utilizando somente o componente, porem a implementação é a mesma para quem está em um projeto construído com Zend Framework, e também mostra o quão modular é o framework.

Nosso projeto seguirá a seguinte estrutura:

  • post_uri
    • index.php

Após a criação do diretório ‘post_uri’ e o arquivo index.php devemos importar nosso componente, para isso vamos utilizar o Composer. Acesse a raiz do projeto pelo terminar e execute o seguinte comando:

1
composer require zendframework/zend-uri

O comando acima, parte do pressuposto que o Composer está instalado de forma global em seu computador, caso não tenha instalado recomendo que leia a documentação do Composer.

Após o processo de instalação ser concluído, nosso projeto ficará com a seguinte estrutura:

  • post_uri
    • vendor
    • composer.json
    • composer.lock
    • index.php

Agora podemos partir para a diversão, SHOW ME THE CODE!

Vamos preparar nosso index.php para explorar as funcionalidades do componente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php 

require_once __DIR__.'/vendor/autoload.php';

use Zend\Uri\UriFactory;

try {
    
} catch (\Exception $e) {
    echo ucfirst($e->getMessage());
}

Em nosso código acima, importamos nosso arquivo de autoload, declaramos que vamos utilizar ‘UriFactory’ e criamos uma estrutura de try cath, essa estrutura é necessária para a utilização do recurso de validação de URI e será descrito mais a frente.

Vamos utilizar como base a seguinte URI de exemplo.

1
url = 'http://www.example.com:8080/mall/products?item1=product 01&item2=product 02#token';

Como a classe UriFactory é uma classe abstrata ela não pode ser instanciada, dito isso vamos criar nossa variável base.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$url = 'http://www.example.com:8080/mall/products?item1=product 01&item2=product 02#token';
$uri = UriFactory::factory($url);
// Retorno
/*
object(Zend\Uri\Http)[3]
  protected 'validHostTypes' => int 19
  protected 'user' => null
  protected 'password' => null
  protected 'scheme' => string 'http' (length=4)
  protected 'userInfo' => null
  protected 'host' => string 'www.example.com' (length=15)
  protected 'port' => int 8080
  protected 'path' => string '/mall/products' (length=14)
  protected 'query' => string 'item1=product 01&item2=product 02' (length=33)
  protected 'fragment' => string 'token' (length=5)
*/

Obtendo o host

Para que possamos capturar o host contido em nossa URI de exemplo, vamos utilizar o método getHost().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php 

require_once __DIR__.'/vendor/autoload.php';

use Zend\Uri\UriFactory;

try {
    $url = 'http://www.example.com:8080/mall/products?item1=product 01&item2=product 02#token';

    $uri = UriFactory::factory($url);

    $host = $uri->getHost(); // Retorna: 'www.example.com'
    
} catch (\Exception $e) {
    echo ucfirst($e->getMessage());
}

Obtendo a porta utilizada

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php 

require_once __DIR__.'/vendor/autoload.php';

use Zend\Uri\UriFactory;

try {
    $url = 'http://www.example.com:8080/mall/products?item1=product 01&item2=product 02#token';

    $uri = UriFactory::factory($url);

    $port = $uri->getPort();  // Retornar: "8080"
    
} catch (\Exception $e) {
    echo ucfirst($e->getMessage());
}

Obtendo o path

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php 

require_once __DIR__.'/vendor/autoload.php';

use Zend\Uri\UriFactory;

try {
  $url = 'http://www.example.com:8080/mall/products?item1=product 01&item2=product 02#token';

  $uri = UriFactory::factory($url);

  $path = $uri->getPath();  // Retorno: '/mall/products'
} catch (\Exception $e) {
  echo ucfirst($e->getMessage());
}

Obtendo a query string

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php 

require_once __DIR__.'/vendor/autoload.php';

use Zend\Uri\UriFactory;

try {
  $url = 'http://www.example.com:8080/mall/products?item1=product 01&item2=product 02#token';

  $uri = UriFactory::factory($url);

  $query = $uri->getQuery();  // Retorno: 'item1=product 01&item2=product 02'
} catch (\Exception $e) {
  echo ucfirst($e->getMessage());
}

Obtendo a query string formatada em array

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php 

require_once __DIR__.'/vendor/autoload.php';

use Zend\Uri\UriFactory;

try {
    $url = 'http://www.example.com:8080/mall/products?item1=product 01&item2=product 02#token';

    $uri = UriFactory::factory($url);

    $query = $uri->getQueryAsArray();  
    // Retorno: 
    /*
        [
            'item1' => string 'product 01'
            'item2' => string 'product 02'
        ]
    */
    
} catch (\Exception $e) {
    echo ucfirst($e->getMessage());
}

Obtendo o fragment

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php 

require_once __DIR__.'/vendor/autoload.php';

use Zend\Uri\UriFactory;

try {
  $url = 'http://www.example.com:8080/mall/products?item1=product 01&item2=product 02#token';

  $uri = UriFactory::factory($url);

  $query = $uri->getFragment();  // Retorno: 'token'
} catch (\Exception $e) {
  echo ucfirst($e->getMessage());
}

Aqui cabe nosso adendo, caso a URI informada o componente irá retornar uma exception ‘Zend\Uri\Exception\InvalidArgumentException’, por isso nossa estrutura está dentro de um try catch.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php 

require_once __DIR__.'/vendor/autoload.php';

use Zend\Uri\UriFactory;

try {
  $url = 'http://www.example.com:8080/mall/products?item1=product 01&item2=product 02#token';

  $uri = UriFactory::factory($url);

  $query = $uri->isValid();  // Retorno: true
} catch (\Exception $e) {
  echo ucfirst($e->getMessage());
}

Como podemos observar, é extremamente simples a utilização do componente, mesmo ele sento utilizado isoladamente não estando com o skeleton do ZF instalado.

Espero que esse post possa ajuda-lo em seu dia a dia, fazendo o processo de manipulação de URI uma tarefa mais amena e tranquila.

Espero que tenha apreciado, até a próxima!