🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ Mehrzad Tajkarimi
در خواست request global
امیر صالحی حل شده توسط امیر صالحی

سلام خسته نباشید
تو این جلسه ما اومدیم request رو نوشتیم 
برای دسترسی به این باید با فراخوانی هر بار global رو صدا بزنیم
اگه امکان داره روش دیگری رو که بشود همجای برنامه در دسترس باشد را مثال برنید
که نیاز به این فراخوانی چند باره نداشته باشد
متشکرم,.’’

در واقع این روش به ذهنم رسید به خواستم رسیدم 
ولی بازم اگه روش بهتری است بفرمایید
 


namespace App\Core;
class Request
{
    private static $params;
    private static $rout_params;
    private static $method;
    private static $ip;
    private static $agent;
    private static $uri;
    public  function __construct()
    {
        self::$params = $_REQUEST;
        self::$method = strtolower($_SERVER['REQUEST_METHOD']);
        self::$ip = $_SERVER['SERVER_ADDR'];
        self::$agent = $_SERVER['HTTP_USER_AGENT'];
        self::$uri = strtok($_SERVER['REQUEST_URI'], '?');
    }
    public function set_param($key, $value)
    {
        self::$rout_params[$key] = $value;
    }
    public function get_param($key = null)
    {
        return is_null($key) ? self::$rout_params : self::$rout_params[$key];
    }
    public  static function params()
    {
        return self::$params;
    }
    public  function method()
    {
        return self::$method;
    }
    public  function ip()
    {
        return self::$ip;
    }
    public  function agent()
    {
        return self::$agent;
    }
    public  function uri()
    {
        return self::$uri;
    }
}
Mehrzad Tajkarimi ۰۱ تیر ۱۴۰۰، ۰۴:۳۷

یه سوال دیگه هم اینگه چرا ما تو router از استاتیک استفاده کردیم ولی تو route استفاده نشده

که مجبور نشیم هر دفعه به شی بسازیم

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

سلام واحترام

 کلاس Route ممکنه چندین بار صدا زده بشه و به خاطر نداشتن دردسرهای new کردن از همون متدهای static داخلش استفاده کردیم، اما کلاس Router فقط یک بار در برنامه استفاده و اجرا میشه و لازم نیست به صورت static داشته باشیمش

 

 

راجب کلاس Request، ما Request رو داشتیم چرا به شکل بالا پیاده سازی کردید؟ دلیل خاصی بوده؟

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

سلام و احترام

میتونید وقتی دارید متد کلاس رو داخل route صدا میزنید چک کنید ببینید متد پارامتری داره و بهش request رو پاس بدید داخل همون route

function need_params($func) {
    $reflection = new ReflectionFunction($func);
    return $reflection->getNumberOfParameters();
}
// use
function foo($arg) {}
echo need_params('foo') > 0 ? 'Needs params' : 'No params';

به این روش میتونید هم چک کنید ببینید اصلا چه پارامترهایی داره، کد زیر یه کد تستیه که ازش ایده بگیرید

public static function fire_theme_method($class, $method)
{
        $fire_args=array();
        $reflection = new ReflectionMethod($class, $method);
    foreach($reflection->getParameters() AS $arg)
    {
        if($_REQUEST[$arg->name])
        $fire_args[$arg->name]=$_REQUEST[$arg->name];
        else
        $fire_args[$arg->name]=null;
    }
    return call_user_func_array(array($class, $method), $fire_args);
}

و اگه یکی از پارامترهای ورودی متد Request بود میتونید داخل روت همونجا Request رو هم بهش پاس بدید

تمام این کار‌ها با کمک reflection‌ها قابل انجامه https://www.php.net/manual/en/class.reflectionfunction.php

بهترین پاسخ
امیر صالحی ۰۳ تیر ۱۴۰۰، ۰۵:۵۵