Como acessar parâmetros de rota, postagem, obtenção etc. no Zend Framework 2

98

Como posso obter vários parâmetros relacionados à solicitação de página no zf2? Como parâmetros post / get, a rota sendo acessada, cabeçalhos enviados e arquivos carregados.

Matsemann
fonte

Respostas:

205

A maneira mais fácil de fazer isso seria usar o plugin Params , introduzido no beta5. Possui métodos utilitários para facilitar o acesso a diferentes tipos de parâmetros. Como sempre, ler os testes pode ser valioso para entender como algo deve ser usado.

Obtenha um único valor

Para obter o valor de um parâmetro nomeado em um controlador, você precisará selecionar o método apropriado para o tipo de parâmetro que está procurando e passar o nome.

Exemplos:

$this->params()->fromPost('paramname');   // From POST
$this->params()->fromQuery('paramname');  // From GET
$this->params()->fromRoute('paramname');  // From RouteMatch
$this->params()->fromHeader('paramname'); // From header
$this->params()->fromFiles('paramname');  // From file being uploaded

 

Valores padrão

Todos esses métodos também suportam valores padrão que serão retornados se nenhum parâmetro com o nome fornecido for encontrado.

Exemplo:

$orderBy = $this->params()->fromQuery('orderby', 'name');

Ao visitar http://example.com/?orderby=birthdate , $ orderBy terá o valor birthdate .
Ao visitar http://example.com/ , $ orderBy terá o nome do valor padrão .
 

Obtenha todos os parâmetros

Para obter todos os parâmetros de um tipo, apenas não passe nada e o plugin Params retornará um array de valores com seus nomes como chaves.

Exemplo:

$allGetValues = $this->params()->fromQuery(); // empty method call

Ao visitar http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues será uma matriz como

array(
    'orderby' => 'birthdate',
    'filter'  => 'hasphone',
);

 

Não usando o plugin Params

Se você verificar o código-fonte do plugin Params, verá que ele é apenas um wrapper fino em torno de outros controladores para permitir uma recuperação de parâmetro mais consistente. Se por algum motivo você deseja / precisa acessá-los diretamente, pode ver no código-fonte como isso é feito.

Exemplo:

$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');

NOTA: Você poderia ter usado as superglobais $ _GET, $ _POST etc., mas isso não é recomendado.

Matsemann
fonte
4
Chamar o plugin params diretamente também é possível, é um atalho para fromRoute ():$this->params('key', 'default')
Robin
@Robin isso é verdade. Observe que você não pode usá-lo para buscar todos os parâmetros de rota, porque chamá-lo sem parâmetros retornará o plug-in Params e não coisas de rota.
Matsemann
1
+1 para o comentário + link dos testes de unidade. Poucos pensam em verificar os testes de unidade por algum motivo.
Xunnamius
4

A maneira mais fácil de obter uma string json postada, por exemplo, é ler o conteúdo de 'php: // input' e então decodificá-lo. Por exemplo, eu tinha uma rota Zend simples:

'save-json' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
            'options' => array(
                'route'    => '/save-json/',
                'defaults' => array(
                    'controller' => 'CDB\Controller\Index',
                    'action'     => 'save-json',
                ),
            ),
        ),

e eu queria postar dados nele usando $ http.post do Angular. A postagem foi boa, mas o método retrive no Zend

$this->params()->fromPost('paramname'); 

não recebi nada neste caso. Então minha solução foi, depois de tentar todos os tipos de métodos como $ _POST e os outros métodos declarados acima, ler 'php: //':

$content = file_get_contents('php://input');
print_r(json_decode($content));

No final, obtive meu array json. Espero que isto ajude.

Susy11
fonte
1
Se você precisar do corpo POST bruto, use getContent () do objeto de solicitação. De um controlador, você poderia fazer:$content = $this->getRequest()->getContent()
Torin Finnemann
No ZF2, como podemos recuperar um parâmetro de URL na forma de ?name=mike?
Stephane,
1
require_once 'lib/Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader(array('autoregister_zf' => true));

$loader->registerNamespace('Http\PhpEnvironment', 'lib/Zend/Http'); 

// Register with spl_autoload:
$loader->register();

$a = new Zend\Http\PhpEnvironment\Request();
print_r($a->getQuery()->get()); exit;
Ankit Vishwakarma
fonte
0

Todos os métodos acima funcionarão bem se o seu tipo de conteúdo for "application / -www-form-urlencoded". Mas se o seu tipo de conteúdo for "application / json", você terá que fazer o seguinte:

$ params = json_decode (file_get_contents ('php: // input'), true); print_r ($ params);

Motivo: consulte o nº 7 em https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make

Lakshmi Ramakrishnan
fonte
0

Se você não tiver acesso ao plugin por exemplo fora do controlador Vocêpoderá obter params do servicelocator assim

//from POST
$foo = $this->serviceLocator->get('request')->getPost('foo'); 
//from GET
$foo = $this->serviceLocator->get('request')->getQuery()->foo;
//from route
$foo = $this->serviceLocator->get('application')->getMvcEvent()->getRouteMatch()->getParam('foo');
Marcin Żurek
fonte