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:
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());
}
|
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!