Имеет ли PHP эквивалент Java RequestDispatcher.forward?

В Java я могу написать действительно базовый JSP index.jsp например:

<% request.getRequestDispatcher("/home.action").forward(request, response); %>

Эффект от этого заключается в том, что пользователь, запрашивающий index.jsp (или только содержащий каталог, предполагающий index.jsp является документом по умолчанию для каталога), увидит home.action без перенаправления браузера, то есть [forward] ( http: // java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse)) происходит на стороне сервера.

Могу ли я сделать что-то подобное с PHP? Я подозреваю, что можно настроить Apache для обработки этого случая, но поскольку у меня может не быть доступа к соответствующей конфигурации Apache, меня бы заинтересовало решение, основанное только на PHP.

Related of "Имеет ли PHP эквивалент Java RequestDispatcher.forward?"

Если вас беспокоит доступность CURL, вы можете использовать file_get_contents() и потоки. Настройка такой функции, как:

 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; } 

Это просто устанавливает GET, но вы можете сделать сообщение с file_get_contents() .

Трюк в Request.Forward заключается в том, что он дает вам чистый новый запрос на нужное действие. Поэтому у вас нет остатка от текущего запроса и, например, никаких проблем с скриптами, которые полагаются на java eq из $ _SERVER ['REQUEST_URI'].

Вы можете просто зайти в класс CURL и написать простую функцию для этого:

 <?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 eg 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); } } } 

Просто выгрузите это в class.CURLHandler.php, и вы можете сделать это:

конечно, использование $ _REQUEST на самом деле небезопасно (вы должны проверить $ _SERVER ['REQUEST_METHOD']), но вы понимаете.

 <?php include('class.CURLHandler.php'); die CURLHandler::doRequest($_SERVER['REQUEST_METHOD'], 'http://server/myaction', $_REQUEST); ?> в <?php include('class.CURLHandler.php'); die CURLHandler::doRequest($_SERVER['REQUEST_METHOD'], 'http://server/myaction', $_REQUEST); ?> 

Конечно, CURL не установлен повсюду, но для этого у нас есть встроенные эмуляторы скручивания PHP.

Кроме того, это дает вам еще большую гибкость, чем Request.Forward, поскольку вы также можете поймать и обработать результат.

Я считаю, что одним из ближайших аналогичных методов было бы использование функции virtual () во время работы php в качестве модуля apache.

virtual () – это специфичная для Apache функция, аналогичная функции mod_include. Он выполняет подзапрос Apache.

Если вы используете MVC, например Zend Framework, вы можете изменить действие контроллера или даже перейти между действиями контроллера. Метод описан следующим образом .

Попробуй это.

 function forward($page, $vars = null){ ob_clean(); include($page); exit; } 

на включенной странице переменная $vars будет работать как атрибуты запроса java

Концепции Redirect и Forward, как и в Java, могут быть достижимы и в PHP.

Redirect :: header("Location: redirect.php"); – (URL-адрес в адресной строке изменяется)

Forward :: include forward.php ; – (URL без изменений в адресной строке)

Его управляемость с помощью этой и других программных логик

Вы можете использовать как:

 header ("Location: /path/"); exit; 

Выход нужен только в том случае, если раньше был отправлен какой-либо вывод HTML, заголовок () не будет работать, поэтому вы должны отправить новый заголовок перед любым выходом в браузер.