سلام خسته نباشید
تو این جلسه ما اومدیم request رو نوشتیم
برای دسترسی به این باید با فراخوانی هر بار global رو صدا بزنیم
اگه امکان داره روش دیگری رو که بشود همجای برنامه در دسترس باشد را مثال برنید
که نیاز به این فراخوانی چند باره نداشته باشد
متشکرم,.’’
سلام و احترام
میتونید وقتی دارید متد کلاس رو داخل 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
در واقع این روش به ذهنم رسید به خواستم رسیدم
ولی بازم اگه روش بهتری است بفرمایید
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;
}
}
یه سوال دیگه هم اینگه چرا ما تو router از استاتیک استفاده کردیم ولی تو route استفاده نشده
که مجبور نشیم هر دفعه به شی بسازیم
سلام واحترام
کلاس Route ممکنه چندین بار صدا زده بشه و به خاطر نداشتن دردسرهای new کردن از همون متدهای static داخلش استفاده کردیم، اما کلاس Router فقط یک بار در برنامه استفاده و اجرا میشه و لازم نیست به صورت static داشته باشیمش
راجب کلاس Request، ما Request رو داشتیم چرا به شکل بالا پیاده سازی کردید؟ دلیل خاصی بوده؟