سلام چرا از کلاس ریکوئست بصورت گلوبال استفاده کردیم دسترسی بصورت گلوبال دیپندسی ایجاد نمیکنه درون متد هامون؟ خب ما که یک آبجکت از ریکوست تو کنستراکتور روتر داریم میتونیم مقادیرمون رو بصورت مستقیم به ریکوست پاس بدیم و تو کنترلر هم مستقیم به مقادیر دسترسی داشته باشیم
تو کلاس ریکوئستم میشه از مجیک متد __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);
}
}
سلام و احترام
dependency در کدوم موارد و کجا؟
ما مثلا میتونیم request ها رو به خود متد های پاس بدیم، چیزی که توی فریم ورک های معروف استفاده میشه. برای مثال
public function single(Request $request) {
nice_dump($request->slug);
nice_dump($request->cid);
}
که این میشه مبحث composition اگه دوست داشتید دربارش بخونید
متدهای اضافه شده به کلاس 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);
}
}