🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ Mehrzad Tajkarimi
url parameters
جامعه پی اچ پی ایجاد شده در ۱۶ تیر ۱۴۰۰

سلام زمانی که با متد put یا patch فرم ارسال میشه رو توضیح ندادین 
پارامتر‌ها ارسالی رو هندل نکردیم
در حال حاضر میزته مسیر یافت نشد.

سلام و احترام

فرم‌ها توی html فقط میتونن post یا get باشن و برای ارسال به صورت متدهای دیگه مثل put باید یه تگ hidden داخل فرم بزاریم تا سمت روتر بررسیش کنیم، یه همچین چیزی

<form method="post" ...>
  <input type="hidden" name="_method" value="put" />

حالا این _method رو داخل آرایه super global POST داریم و میتونیم جداگانه داخل کلاس request هم ذخیرش کنیم تا بتونیم چک کنیم ببینم اگه روت ما post بود میایم بررسی کنیم ببینیم _method که تعرفی کردیم با method داخل route همخونی داره یا ن 

 

داخل کلاس request

public function __construct()
{
    $this->form_method = isset($REQUEST['_method']) ? $REQUEST['_method'] : '';
    $this->params = $_REQUEST;
    $this->agent = $_SERVER['HTTP_USER_AGENT'];
    $this->method = strtolower($_SERVER['REQUEST_METHOD']);
    $this->ip = $_SERVER['REMOTE_ADDR'];
    $this->uri = strtok($_SERVER['REQUEST_URI'], '?');
}

اگه دقت کرده باشید اول متد construct تغریف کرد متغیر form_method رو حالا ما همینو داریم و میتونیم داخل کلاس router متد findCurrentRoute هم بررسیش کنیم

داخل متد findCurrentRoute هم باید یه شرط بزارید ببینید form_method  خالی نباشه و اگه خالی نبود مقدارش با با متد روت مقایسه کنید تا ببینید تطابق داره یا ن

امیر صالحی ۱۶ تیر ۱۴۰۰، ۱۰:۵۳

سلام خواستم بگم مشکل رو حل کردم 
فقط شما فرمودین داخل  findCurrentRoute باید چک بکنیم 
که ای ساعتها منو به اشتباه انداخت 
و در واقع متوجه نمیشدم
بعد با اصلاح  method  در کلاس  request و چک کردم مقدار دریافتی در پارامتر  method_
مشکل حل شد.

 

 

class Request
{
    private  $form_method;
    public  function __construct()
    {
     $this->form_method = isset($_REQUEST['_method']) ? $_REQUEST['_method'] : '';
     }
    public  function method()
    {
        if ($this->method == 'post' && !empty($this->form_method)) {
            $this->method = $this->form_method;
        }
        return $this->method;
    }
  }






 

Mehrzad Tajkarimi ۱۸ تیر ۱۴۰۰، ۱۴:۳۷

سلام و احترام

این متدها توی همه ی روتر‌ها وجود داره و دلیلش هم اینکه باید متوجه بشیم روتی که تعریف کردیم دقیقا میخواد چی کارکنه، برای مثال اگه قراره چیزی آپدیت بشه حتما باید براش حتما verb که همون (post - put - delete - get و.) هستش رو قرار بدیم تا داخل کد هم قابل کنترل باشه و درخواستی که از سمت کاربر میاد رو بتونیم کنترل کنیم

https://datatracker.ietf.org/doc/html/rfc7231#section-4

 

میتونیم به این شکل چک کنیم ببینیم اصلا درخواستی که اومده برای مثال delete بوده یا ن 

$_SERVER['REQUEST_METHOD'] === 'DELETE'

 

فقط یه موردی، اگه به پاسخی نمره منفی میدید لطف کنید دلیلشو هم بگید تا کیفیت پاسخ گویی‌ها رو بالا ببریم، ممنون

 

امیر صالحی ۱۹ تیر ۱۴۰۰، ۱۷:۱۸

سلام خسته نباشید 
چیزی من از پاسخ شما برداشت کردم 
مشکل من رو نتونست حل بکنه
خیلی تلاش کردم کلی وقت گذاشتم که دستوری که شما دادین استفاده کنم ولی به نتیجه نرسیدم 
ببینید فرمایش شما تا اونجا نتیجه داشت که مقدار hidden در واقع داخل request در یافت میکردیم
ولی بعد شما فرمودین داخل روت باید بهش دسترسی داشت ولی برای استقاده از مقادیر put delete باید قبل از روتر این اقدام صورت بگیره تا مقدار روت شامل آرایه‌های دریافتی از request باشد
حتما شما خیلی خیلی تحربه بیشتری از من دارید
من متوجه هستم شما فقط مسیر رو به ما قرار هست در پاسختون نشون بدهید 
من هم موافق این داستان هستم 
ولی مسیری باشه که شما خودتون پیاده کرده باشید و نتیحه رو دیده باشید 
هیج قصد و غرضی در کار نیست 
من هرجا نتیجه گرفتم تیک مثبت رو زدم هرجایی پاسخ شما بهم کمک نکرد اعلام کردم 
در بالا هم دلایلم در پاسخ شما دلیل به نتیجه نرسیدنم رو هم عرض کردم خدمتتون 

Mehrzad Tajkarimi ۲۰ تیر ۱۴۰۰، ۰۳:۵۰