بهبود فایل route در php mvc
https://lamtakam.com/qanda/2704/بهبود-فایل-route-در-php-mvc 1سلام من از php mvc استفاده میکنم و این فایل route من هست
<?php namespace Core;
class Router
{
protected $routes = [];
protected $params = [] ;
protected $namespace = 'App\Controllers\\';
public function add($route , $params )
{
$route = preg_replace('/^\//','' , $route);
$route = preg_replace('/\//' , '\\/' , $route);
$route = preg_replace('/\{([a-z]+)\}/' , '(?<\1>[a-z0-9-]+)' , $route);
$route = '/^' . $route . '\/?$/i';
if(is_string($params)) {
list($AllParams['controller'] , $AllParams['method']) = explode('@' , $params);
}
if(is_array($params)) {
list($AllParams['controller'] , $AllParams['method']) = explode('@' , $params['uses']);
unset($params['uses']);
$AllParams = array_merge($AllParams , $params);
}
$this->routes[$route] = $AllParams;
}
public function match($url)
{
foreach ($this->routes as $route => $params) {
if(preg_match($route , $url , $matches)) {
foreach ($matches as $key => $match) {
if(is_string($key)) {
$params['params'][$key] = $match;
}
}
$this->params = $params;
return true;
}
}
return false;
}
public function dispatch($url)
{
$url = $this->removeVariblesOfQueryString($url);
if($this->match($url)) {
$controller = $this->params['controller'];
$controller = $this->getNameSpace() . $controller;
if(class_exists($controller)) {
$controller_object = new $controller();
$method = $this->params['method'];
if(is_callable([$controller_object , $method])) {
$this->params['params'] = isset($this->params['params']) ? $this->params['params'] : [];
echo call_user_func_array([$controller_object , $method] , $this->params['params']);
} else {
throw new \Exception("Method {$method} (in controller {$controller}) not found");
}
} else {
throw new \Exception("Controller class {$controller} not found",404);
}
} else {
throw new \Exception("no route matched.",404);
}
}
public function getRoutes()
{
return $this->routes;
}
public function getParams()
{
return $this->params;
}
protected function getNameSpace()
{
$namespace = $this->namespace;
if(array_key_exists('namespace' , $this->params)) {
$namespace .= $this->params['namespace'] . '\\';
}
return $namespace;
}
protected function removeVariblesOfQueryString($url)
{
if($url != '') {
$parts = explode("&" , $url , 2);
if(strpos($parts[0] , '=') === false) {
$url = $parts[0];
} else {
$url = '';
}
return $url;
}
}
}
حالا من اومدم یه روت ایجاد کردم به شکل زیر
$router->add('/news/{city}','cityController@index');
مشکل اینجاست وقتی به سیتی پارامتر فارسی پاس میدم برام ارور میداد ارور زیر
Fatal error
Uncaught exception: 'Exception'
Message : 'no route matched.'
Stack trace:
0 C:\xampp\htdocs\afmPdf\public\index.php(13): Core\Router->dispatch('news/\xD8\xA7\xD8\xB1\xD8\xA7\xDA\xA9')
1 {main}
Thrown in 'C:\xampp\htdocs\afmPdf\Core\Router.php' on line 74
حالا من چیکار کنم که بتونم پارامتر فارسی هم بفرستم چه تغییری باید ایجاد کنم؟
خب ظاهرا اون روتی که شما کال میکنید مچ نمیشه با روت هایی که تعریف کرده اید. آيا مطمئنید روت رو از قبل تعریف کرده اید ؟ ــ Ali reza در 5 سال قبل | |||
سلام ممنون از توجهتون بله جناب من روت رو نوشتم |
|||
لطفا اگر پاسختون رو گرفتید .. جواب مورد نظرتون رو تایید کنید (تیک سبز رنگ رو بزنید) ــ سجاد شفی زاده |