Does PHP Have an Equivalent of Java's RequestDispatcher.forward?

后端 未结 7 2130
南笙
南笙 2021-02-06 03:32

In Java I can write a really basic JSP index.jsp like so:

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

相关标签:
7条回答
  • 2021-02-06 04:03

    If you use an MVC like the Zend Framework provides you can change the controller action or even jump between controller actions. The method is _forward as described here.

    0 讨论(0)
  • The trick about Request.Forward is that it gives you a clean, new request to the action you want. Therefore you have no residu from the current request, and for example, no problems with scripts that rely on the java eq of $_SERVER['REQUEST_URI'] being something.

    You could just drop in a CURL class and write a simple function to do this:

    <?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 this in class.CURLHandler.php and you can do this:

    ofcourse, using $_REQUEST is not really safe (you should check $_SERVER['REQUEST_METHOD']) but you get the point.

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

    Ofcourse, CURL's not installed everywhere but we've got native PHP curl emulators for that.

    Also, this gives you even more flexibility than Request.Forward as you could also catch and post-process the output.

    0 讨论(0)
  • 2021-02-06 04:14

    You can use like:

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

    The exit is need just in case some HTML output was sent before, the header() will not work, so you must sent new header before any output to the browser.

    0 讨论(0)
  • 2021-02-06 04:15

    If you are concerned about CURL availability then you could use file_get_contents() and streams. Setting up a function like:

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

    This just sets up a GET, but you can do a post with file_get_contents() as well.

    0 讨论(0)
  • 2021-02-06 04:16

    Try this.

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

    on included page the $vars variable will work as the java request attributes

    0 讨论(0)
  • 2021-02-06 04:23

    I believe one of the closest analogous methods would be to use the virtual() function on while running php as an apache module.

    virtual() is an Apache-specific function which is similar to in mod_include. It performs an Apache sub-request.

    0 讨论(0)
提交回复
热议问题