Frage

In Java kann ich eine wirklich grundlegende JSP index.jsp schreiben wie folgt:

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

Der Effekt davon ist, dass ein Benutzer anfordert index.jsp (oder nur das darin enthaltene Verzeichnis unter der Annahme index.jsp ist ein Standarddokument für das Verzeichnis) home.action ohne Browser Umleitung, dh den [weiter] ( http: //java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse)) auf der Serverseite passiert.

Kann ich etwas ähnliches mit PHP? Ich vermute, es ist möglich, Apache zu konfigurieren, um diesen Fall zu behandeln, aber da ich keinen Zugriff auf die entsprechende Apache-Konfiguration haben könnte ich in einer Lösung interessiert sein würde, die allein auf PHP basiert.

War es hilfreich?

Lösung

Wenn Sie besorgt über CURL Verfügbarkeit sind dann könnten Sie file_get_contents() und Bäche verwenden. Einrichten einer Funktion wie:

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

Dies stellt nur einen GET-up, aber Sie können auch einen Beitrag mit file_get_contents() tun.

Andere Tipps

Der Trick über Request.Forward ist, dass es eine saubere, neue Anfrage zu der Aktion gibt Sie wollen. Daher haben Sie keine residu der aktuellen Anforderung, und beispielsweise keine Probleme mit Skripten, die $ _SERVER auf der Java-eq verlassen [ ‚REQUEST_URI‘], etwas.

Sie könnten nur in einer ROTATION Klasse fallen und eine einfache Funktion schreiben, dies zu tun:

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

}

Just Dump dies in class.CURLHandler.php und Sie können dies tun:

ofcourse, mit $ _REQUEST ist nicht wirklich sicher (Sie sollten _SERVER $ überprüfen [ 'REQUEST_METHOD']), aber Sie erhalten den Punkt.

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

Natürlich steht, ist ROTATION nicht installiert überall , aber wir haben nativen PHP curl Emulatoren für das.

Auch das gibt Ihnen noch mehr Flexibilität als Request.Forward, wie Sie auch die Ausgabe nachbearbeiten fangen und könnten.

Ich glaube, einer der engsten analogen Methoden der virtuellen zu verwenden wäre ( ) Funktion auf, während pHP als apache-Modul ausgeführt wird.

  

virtual () ist eine Apache-spezifische Funktion, die ähnlich    im   mod_include. Es führt einen Apache   Unter Anfrage.

Wenn Sie eine MVC wie das Zend Framework verwenden, bieten Sie die Controller-Aktion ändern oder sogar zwischen Controller-Aktionen springen. Das Verfahren wird _forward als hier beschrieben .

Versuchen Sie dies.

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

auf Seite enthalten die $vars Variable funktioniert wie die Java-Anfrage-Attribute

Konzepte Umleiten und Weiterleiten wie in Java kann in PHP auch erreichbar sein.

Redirect :: header("Location: redirect.php"); - (URL in der Adresszeile Änderungen)

Weiterleiten :: include forward.php ; - (URL unverändert bei Adressleiste)

Die überschaubare mit diesem und anderer Programmierlogik

Sie können wie verwenden:

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

Der Ausgang ist muß für alle Fälle einig HTML-Ausgabe wurde vor ausgesendet, der header () wird nicht funktionieren, so müssen Sie geschickt neue Header vor jede Ausgabe an den Browser.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top