چرا از ریکوئست بصورت گلوبال استفاده کردیم؟

پرسیده شده
فعالیت 1077 روز پیش
دیده شده 604 بار
0

سلام چرا از کلاس ریکوئست بصورت گلوبال استفاده کردیم دسترسی بصورت گلوبال دیپندسی ایجاد نمیکنه درون متد هامون؟ خب ما که یک آبجکت از ریکوست تو کنستراکتور روتر داریم میتونیم مقادیرمون رو بصورت مستقیم به ریکوست پاس بدیم و تو کنترلر هم مستقیم به مقادیر دسترسی داشته باشیم

تو کلاس ریکوئستم میشه از مجیک متد __set برای مقدار دهیمون استفاده کنیم

 public function regexMatched($route){
        $pattern="/^".str_replace(['/','{','}'],['\/','(?<','>[-%\w]+)'],$route['uri'])."$/";
        $result=preg_match($pattern,$this->request->uri(),$matches);
        if(!$result){
            return false;
        }
        foreach ($matches as $key=>$value){
            if(!is_int($key)){
            $this->request->$key=$value;
            }
        }
        return true;
    }

دسترسی به مقادیر درون کلاس کنترولر ما

namespace App\Controllers;
use App\Core\Request;


class PostController{
    private $request;
    public function __construct(){
        $this->request = new Request();
    }
    public function single() {
       nice_dump($this->request->slug);
       nice_dump($this->request->cid);
    }
}
فایل پیوست

امیر
امیر

2 خرداد 00

0
حذف شده

سلام و احترام

dependency در کدوم موارد و کجا؟ 

ما مثلا میتونیم request ها رو به خود متد های پاس بدیم، چیزی که توی فریم ورک های معروف استفاده میشه. برای مثال

 

  public function single(Request $request) {
       nice_dump($request->slug);
       nice_dump($request->cid);
    }

که این میشه مبحث composition اگه دوست داشتید دربارش بخونید

فایل پیوست

امیر صالحی

توسط

امیر صالحی

3 خرداد 00

حذف شده
والا استاد اومدن درون یکی از متد های روتر برای catch کردن پارامتر های درون روت به این صورت عمل کردن global $request درواقع اومدن یه آبجکت از Request رو بصورت گلوبال درون متد روتر فراخونی کردن و ازون ورم تو کنترولر هم برای اینکه این پارامترارو بگیرن دوباره Request بصورت گلوبال صدا زدن که باعث شده متدهامون مستقیما به $request دیپندسی داشته باشن برای اینکه این مشکل رو نداشته باشیم چیکار باید کنیم؟
امیر

3 خرداد 00

حذف شده
چیزی که خودم نوشتم رو پایین میزارم لطفا یه نگاه کنید که به این صورت عمل کردن کار درستیه یا خیر
امیر

3 خرداد 00

0
حذف شده

متدهای اضافه شده به کلاس Request

مقادیر موجود در روت را تو آرایه($_REQUEST)  قرار دادم


	public function setParams($name,$params)
	{
        $_REQUEST[$name] = $params;
        return $this;
    }
    public function __set($key, $value):void
    {
        $this->setParams($key,$value);
    }

بخشی از کلاس روتر که مقادیر موجود در روت ها کچ می شوند 

 

class Router
{
    private $request;
    private $routes;
    private $current_route;
    private $middleware;
    private $globalMiddleware;

    public function __construct()
    {
        $this->request = new Request();
        $this->globalMiddleware = new globalMiddleware();
        $this->runGlobalMiddleware();
        $this->routes = Route::getRoutes();
        $this->current_route = $this->findRoute($this->request) ?? null;
        $this->middleware = isset($this->current_route['middleware']) ? $this-		  >current_route['middleware'] : null;
        $this->runRouteMiddleware();

    }

    public function findRoute(Request $request)
    {
        foreach ($this->routes as $route) {
            if ($this->regexMatched(($route))) {
                return $route;
            }
        };

        return null;
    }

    public function regexMatched($route)
    {
        $pattern="/^".str_replace(['/','{','}'],['\/','(?<','>[-%\w]+)'],$route['uri'])."$/";
        $result=preg_match($pattern,$this->request->uri(),$matches);
        if(!$result){
            return false;
        }
        foreach ($matches as $key=>$value){
            if(!is_int($key)){
            $this->request->setParams($key,$value);
            }
        }
        return true;
    }

 

کلاس کترولر برای دریافت مقادیر


class PostController{
   
    private  $request;
    public function __construct()
    {
        $this->request = new Request();
    }


    public function single() 
    {
       nice_dump($this->request->slug);
       nice_dump($this->request->cid);  
    }
}
فایل پیوست

امیر

توسط

امیر

3 خرداد 00