O PHP tem um equivalente de RequestDispatcher.forward de Java?
-
10-07-2019 - |
Pergunta
Em Java eu ??posso escrever uma index.jsp
realmente básico JSP assim:
<% request.getRequestDispatcher("/home.action").forward(request, response); %>
O efeito disto é que um usuário solicitar index.jsp
(ou apenas o diretório que contém assumindo index.jsp
é um documento padrão para o diretório) vai ver home.action
sem um redirecionamento do navegador, ou seja, o [frente] ( http: //java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse)) acontece no lado do servidor.
Posso fazer algo semelhante com PHP? Eu suspeito que é possível configurar o Apache para lidar com este caso, mas desde que eu pode não ter acesso à configuração do Apache relevante eu estaria interessado em uma solução que depende sozinho PHP.
Solução
Se você está preocupado sobre a disponibilidade CURL então você poderia usar file_get_contents()
e córregos. A criação de uma função como:
function forward($location, $vars = array())
{
$file ='http://'.$_SERVER['HTTP_HOST']
.substr($_SERVER['REQUEST_URI'],0,strrpos($_SERVER['REQUEST_URI'], '/')+1)
.$location;
if(!empty($vars))
{
$file .="?".http_build_query($vars);
}
$response = file_get_contents($file);
echo $response;
}
Isso só estabelece um GET, mas você pode fazer um post com file_get_contents()
também.
Outras dicas
O truque sobre Request.Forward é que ele dá-lhe um ambiente limpo, novo pedido para a ação desejada. Portanto você não tem residu da requisição atual, e, por exemplo, sem problemas com scripts que dependem do java eq de $ _SERVER [ 'REQUEST_URI'] sendo algo.
Você poderia simplesmente cair em uma classe CURL e escrever uma função simples de fazer isso:
<?php
/**
* CURLHandler handles simple HTTP GETs and POSTs via Curl
*
* @author SchizoDuckie
* @version 1.0
* @access public
*/
class CURLHandler
{
/**
* CURLHandler::Get()
*
* Executes a standard GET request via Curl.
* Static function, so that you can use: CurlHandler::Get('http://www.google.com');
*
* @param string $url url to get
* @return string HTML output
*/
public static function Get($url)
{
return self::doRequest('GET', $url);
}
/**
* CURLHandler::Post()
*
* Executes a standard POST request via Curl.
* Static function, so you can use CurlHandler::Post('http://www.google.com', array('q'=>'belfabriek'));
* If you want to send a File via post (to e.g. PHP's $_FILES), prefix the value of an item with an @ !
* @param string $url url to post data to
* @param Array $vars Array with key=>value pairs to post.
* @return string HTML output
*/
public static function Post($url, $vars, $auth = false)
{
return self::doRequest('POST', $url, $vars, $auth);
}
/**
* CURLHandler::doRequest()
* This is what actually does the request
* <pre>
* - Create Curl handle with curl_init
* - Set options like CURLOPT_URL, CURLOPT_RETURNTRANSFER and CURLOPT_HEADER
* - Set eventual optional options (like CURLOPT_POST and CURLOPT_POSTFIELDS)
* - Call curl_exec on the interface
* - Close the connection
* - Return the result or throw an exception.
* </pre>
* @param mixed $method Request Method (Get/ Post)
* @param mixed $url URI to get or post to
* @param mixed $vars Array of variables (only mandatory in POST requests)
* @return string HTML output
*/
public static function doRequest($method, $url, $vars=array(), $auth = false)
{
$curlInterface = curl_init();
curl_setopt_array ($curlInterface, array(
CURLOPT_URL => $url,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION =>1,
CURLOPT_HEADER => 0));
if (strtoupper($method) == 'POST')
{
curl_setopt_array($curlInterface, array(
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => http_build_query($vars))
);
}
if($auth !== false)
{
curl_setopt($curlInterface, CURLOPT_USERPWD, $auth['username'] . ":" . $auth['password']);
}
$result = curl_exec ($curlInterface);
curl_close ($curlInterface);
if($result === NULL)
{
throw new Exception('Curl Request Error: '.curl_errno($curlInterface) . " - " . curl_error($curlInterface));
}
else
{
return($result);
}
}
}
Apenas despejar isso em class.CURLHandler.php e você pode fazer isso:
é claro, usando $ _REQUEST não é realmente seguro (você deve verificar $ _SERVER [ 'REQUEST_METHOD']), mas você começa o ponto.
<?php
include('class.CURLHandler.php');
die CURLHandler::doRequest($_SERVER['REQUEST_METHOD'], 'http://server/myaction', $_REQUEST);
?>
Claro, CURL não está instalado em todos os lugares mas temos emuladores PHP onda nativas para isso.
Além disso, este dá-lhe ainda mais flexibilidade do que Request.Forward como você também pode pegar e pós-processamento de saída.
Eu acredito que um dos métodos análogos mais próximos seria usar a virtual ( ) função enquanto rodando o PHP como um apache módulo.
virtual () é uma função específica do Apache que é semelhante ao no mod_include. Ele executa um Apache sub-pedido.
Se você usar um MVC como o Zend Framework fornece você pode alterar a ação do controlador ou até mesmo saltar entre ações do controlador. O método é _forward como descrito aqui .
Tente isto.
function forward($page, $vars = null){
ob_clean();
include($page);
exit;
}
na página incluída a variável $vars
vai funcionar como os atributos de solicitação de java
Conceito redirecionamento e para a frente como em Java, pode ser alcançado em PHP também.
Redirect :: header("Location: redirect.php");
- (URL no endereço barra muda)
Atacante :: include forward.php ;
- (URL inalterada em barra de endereços)
A sua gerenciável com este e outras lógicas de programação
Você pode usar como:
header ("Location: /path/");
exit;
A saída é necessário apenas no caso de alguma saída HTML foi enviado antes, o header () não vai funcionar, então você deve enviou novo cabeçalho antes de qualquer saída para o navegador.