Есть ли у PHP эквивалент Java-запроса RequestDispatcher.forward? - PullRequest
9 голосов
/ 12 января 2009

В 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.

Ответы [ 7 ]

1 голос
/ 09 марта 2012

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

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

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

1 голос
/ 12 января 2009

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

1 голос
/ 12 января 2009

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

virtual () - это специфичная для Apache функция, которая похожа на в mod_include. Выполняет апач суб-запрос.

1 голос
/ 12 января 2009

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

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

<code><?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.
     * 
* @param mixed $ method Метод запроса (Получить / Опубликовать) * @param mixed URI $ url для получения или публикации * @param mixed $ vars Массив переменных (обязательно для запросов POST) * @return string вывод HTML * / публичная статическая функция 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) { генерировать новое исключение ('Ошибка запроса Curl:' .curl_errno ($ curlInterface). "-". curl_error ($ curlInterface)); } еще { возврат ($ результат); } } }

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

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

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

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

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

0 голосов
/ 04 ноября 2014

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

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

Переслать :: include forward.php ; - (URL-адрес неизменен в адресной строке)

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

0 голосов
/ 12 января 2009

Если вас беспокоит доступность 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().

0 голосов
/ 12 января 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...