هل لدى PHP ما يعادل RequestDispatcher.forward الخاص بجافا؟

StackOverflow https://stackoverflow.com/questions/433774

  •  10-07-2019
  •  | 
  •  

سؤال

في Java يمكنني كتابة JSP أساسي حقًا index.jsp مثل ذلك:

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

تأثير ذلك هو أن المستخدم يطلب index.jsp (أو فقط بافتراض الدليل الذي يحتوي على index.jsp هو مستند افتراضي للدليل) سوف نرى home.action بدون إعادة توجيه المتصفح، على سبيل المثال.إلى الأمام](http://java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse)) يحدث على جانب الخادم.

هل يمكنني أن أفعل شيئًا مشابهًا مع PHP؟أظن أنه من الممكن تكوين Apache للتعامل مع هذه الحالة، ولكن بما أنني قد لا أتمكن من الوصول إلى تكوين Apache ذي الصلة، فسأكون مهتمًا بحل يعتمد على PHP وحده.

هل كانت مفيدة؟

المحلول

إذا كنت تشعر بالقلق إزاء توفر الضفيرة ثم هل يمكن استخدام 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 هو أنه يعطيك، طلب نظيفة جديدة إلى الإجراء الذي تريد. لذلك لم يكن لديك residu من الطلب الحالي، وعلى سبيل المثال، ولا توجد مشاكل مع البرامج النصية التي تعتمد على مكافئ جافا من _SERVER $ [ 'REQUEST_URI'] يجري شيء.

هل يمكن أن مجرد قطرة في فئة الضفيرة والكتابة وظيفة بسيطة للقيام بذلك:

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

}

ومجرد تفريغ هذا في class.CURLHandler.php ويمكنك القيام بذلك:

وفكورسي، وذلك باستخدام $ _REQUEST ليست آمنة حقا (يجب عليك مراجعة $ _SERVER [ 'REQUEST_METHOD'])، ولكن تحصل على هذه النقطة.

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

وطبعا ...، ليست تثبيت الضفيرة <م> في كل مكان ولكن لدينا <في أ href = "http://code.blitzaffe.com/pages/phpclasses/category/52/fileid/7" يختلط = "نوفولو noreferrer"> الأم محاكاة PHP حليقة لذلك.

وأيضا، وهذا يمنحك المزيد من المرونة من Request.Forward كما يمكن أن قبض أيضا وبعد عملية الإخراج.

أعتقد أن إحدى الطرق المماثلة الأقرب هي استخدام افتراضي() تعمل أثناء تشغيل php كوحدة أباتشي.

افتراضي() هي دالة خاصة بـ Apache تشبه في mod_include.ينفذ مسارها الفرعي Apache.

إذا كنت تستخدم MVC مثل ما يوفره Zend Framework، فيمكنك تغيير إجراء وحدة التحكم أو حتى الانتقال بين إجراءات وحدة التحكم.الطريقة _forward as الموصوفة هنا.

وجرب هذا.

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

وعلى الصفحة شملت ومتغير $vars تعمل كما سمات طلب جافا

والمفاهيم إعادة التوجيه وإعادة توجيه مثل في جاوة، يمكن أن تكون قابلة للتحقيق في PHP للغاية.

وإعادة توجيه :: header("Location: redirect.php"); - (URL في شريط العنوان التغييرات)

والى الامام :: include forward.php ; - (URL دون تغيير عند شريط العنوان)

ولها قابلية للإدارة مع هذه وغيرها من المنطق البرمجة

يمكنك استخدام مثل:

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

هناك حاجة إلى الخروج فقط في حالة إرسال بعض مخرجات HTML من قبل، فلن يعمل header()، لذلك يجب عليك إرسال رأس جديد قبل أي الإخراج إلى المتصفح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top