التعامل مع PUT / DELETE الوسيطات في PHP


Answers

فيما يلي بعض التعليمات البرمجية التي قد تكون مفيدة للآخرين الذين يريدون التعامل مع المعلمات PUT و DELETE. يمكنك تعيين $_PUT و $_DELETE عبر $_DELETE $GLOBALS[] ، ولكن لن يتم الوصول إليها مباشرة في الوظائف ما لم يتم الإعلان عنها global أو يمكن الوصول إليها عبر $GLOBALS[] . للتغلب على هذا ، لقد قمت بإعداد فئة بسيطة لقراءة حجج طلب GET / POST / PUT / DELETE. هذا أيضًا بملء $_REQUEST مع $_REQUEST PUT / DELETE.

ستقوم هذه الفئة بتحليل المعلمات PUT / DELETE ودعم GET / POST أيضًا.

class Params {
  private $params = Array();

  public function __construct() {
    $this->_parseParams();
  }

  /**
    * @brief Lookup request params
    * @param string $name Name of the argument to lookup
    * @param mixed $default Default value to return if argument is missing
    * @returns The value from the GET/POST/PUT/DELETE value, or $default if not set
    */
  public function get($name, $default = null) {
    if (isset($this->params[$name])) {
      return $this->params[$name];
    } else {
      return $default;
    }
  }

  private function _parseParams() {
    $method = $_SERVER['REQUEST_METHOD'];
    if ($method == "PUT" || $method == "DELETE") {
        parse_str(file_get_contents('php://input'), $this->params);
        $GLOBALS["_{$method}"] = $this->params;
        // Add these request vars into _REQUEST, mimicing default behavior, PUT/DELETE will override existing COOKIE/GET vars
        $_REQUEST = $this->params + $_REQUEST;
    } else if ($method == "GET") {
        $this->params = $_GET;
    } else if ($method == "POST") {
        $this->params = $_POST;
    }
  }
}
Question

أنا أعمل على مكتبة عميل REST الخاصة بي CodeIgniter وأنا أواجه صعوبة في العمل على كيفية إرسال الحجج PUT و DELETE في PHP.

في أماكن قليلة ، رأيت أشخاصًا يستخدمون الخيارات:

$this->option(CURLOPT_PUT, TRUE);
$this->option(CURLOPT_POSTFIELDS, $params);

مزعج ، يبدو أن هذا لا يفعل شيئا. هل هذه هي الطريقة الصحيحة لضبط معلمات PUT؟

إذا كان الأمر كذلك ، كيف أقوم بتعيين معلمات DELETE؟

$ this-> option () هو جزء من مكتبتي ، إنه يبني ببساطة مجموعة من ثوابت CURLOPT_XX ويرسلها إلى curl_setopt_array () عند تنفيذ طلب cURL المدمج.

أحاول قراءة معلمات PUT و DELETE باستخدام التعليمة البرمجية التالية:

        case 'put':
            // Set up out PUT variables
            parse_str(file_get_contents('php://input'), $this->_put_args);
        break;

        case 'delete':
            // Set up out PUT variables
            parse_str(file_get_contents('php://input'), $this->_delete_args);
        break;

هناك خياران هنا ، وأنا أقترب من هذا بطريقة خاطئة أو هناك خطأ في مكان ما في المكتبات. إذا كان بإمكانك أن تخبرني إذا كان يجب أن يعمل ذلك نظريًا ، فيمكنني أن أدقق في التصحيح حتى أتمكن من حلها.

أنا لا أريد أن أضيع المزيد من الوقت على نهج خاطئ في الأساس.




هذا هو الإصدار الخاص بي من DELETE لـ CI. وهو يقبل وسيطات GET-style للحرف DELETE ، وحتى وسائط الاسم نفسها ، بمعنى: GET / some / url؟ id = 1 & id = 2 & id = 3

protected function _parse_delete()
{
    $query = $_SERVER['QUERY_STRING'];
    if ( !empty( $query ) )
    {
        foreach( explode('&', $query ) as $param )
        {
            list($k, $v) = explode('=', $param);
            $k = urldecode($k);
            $v = urldecode($v);
            if ( isset( $this->_delete_args[$k] ) )
            {
                if ( is_scalar( $this->_delete_args[$k] ) )
                {
                    $this->_delete_args[$k] = array( $this->_delete_args[$k] );
                }
                $this->_delete_args[$k][] = $v ;
            }
            else
            {
                $this->_delete_args[$k] = $v;
            }
        }
    }
}



أعتقد أنك تقوم بخلط الأفعال الخاصة بك - PUT هو لوضع ملف ، POST هو لنشر المتغيرات (على الرغم من أنك يمكن أن POST ملف).

لتعيين متغيرات الوظائف ، استخدم CURLOPT_POSTFIELDS إما بسلسلة من param1=val1&param2=val2 أو صفيف مجموعة.

لإجراء DELETE ، سترغب في استخدام خيار curl CURLOPT_CUSTOMREQUEST




Links