Проблема с перенаправлением и ссылками с использованием MVC в PHP - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь зайти в MVC, но сталкиваюсь с проблемой, которая нигде не объясняется, а именно как перенаправить с одного контроллера на другой.

Я использую следующий файл .htaccess:

RewriteEngine On 

RewriteCond% {REQUEST_FILENAME}!-F 
RewriteCond% {REQUEST_FILENAME}!-D 

RewriteRule ^(.*)$ index.php? Url = $ 1 [L, QSA] 

, чтобы использовать контроллер сразу после того, как он установил его методы и id th.

Все это работает, получая доступ к ним стандартным способом, но при выборе вида на дальнейшие страницы иенаты используются непосредственно в качестве контроллера.

<a href="next_page_controler"> NEXT_PAGE </ a>

и доступ к следующему контроллеру, но когда я хочу получить доступ к методам, необходимо использовать

<a href="next_page_controler/**controler_model**"> NEXT-pAGE_MODEL </ a> 

, и здесь у нас есть две проблемы:

  1. Несколько раз ссылка в адресной строке отображается еще раз, повторяется как

    www.site_pat/next_page_controler/next_page_controler/next_page_controler/next_page_controler/next_page_controler/controler_model

  2. При попытке перенаправить как метод controler_model с использованием заголовка (Location: controler_name);ничего не получает, не тянет сообщение или что-то просто хочет попробовать, но перенаправление не работает.

Как решить проблемы, я думаю, многие из вас сталкивались с этими основными вещами, и я думаю,чтобы крики вообще начали работать с фреймворком, надо понимать эти основы.

Ответы [ 2 ]

1 голос
/ 27 июля 2011

ОБНОВЛЕНИЕ :

@ prodigitalson. Можете ли вы привести пример

Так что очень простой пример может выглядеть как следующий код.На самом деле я никогда не писал роутер из sractch, потому что я обычно использую фреймворк, так что, вероятно, в нем есть какие-то функции, которые вам не нужны ... Маршрутизация - это довольно сложные вещи, в зависимости от того, насколько вы хотите их получить.Я бы рекомендовал посмотреть, как это делают несколько различных php-фреймворков, для хороших примеров.

// define routes as a regular expression to match
$routes = array(
  'default' => array(
     'url' => '#^/categories/(?P<category_slug>\w*(/.*)?$#',
     'controller' => 'CategoryController'
   )
  )
);

// request - you should probably encapsulate this in a model 
$request = array();

// loop through routes and see if we have a match
foreach($routes as $route){
  // on the first match we assign variables to the request and then
  // stop processing the routes
  if(preg_match($route['url'], $_SERVER['REQUEST_URI'], $params)){
    $request['controller'] = $route['controller'];
    $request['params'] = $params;
    $request['uri'] = $_SERVER['REQUEST_URI'];
    break;
  }
}

// check that we found a match
if(!empty($request)){
  // dispatch the request to the proper controller
  $controllerClass = $request['controller'];
  $controller = new $controllerClass();

  // because we used named subpatterns int he regex above we can access parameters
  // inside the CategoryController::execute() with $request['params']['category_slug']
  $response = $controller->execute($request);
} else {
  // send 404
}

// in this example $controller->execute() returns the compiled HTML to render, but
// but in most systems ive used it returns a View object, or the name of the template to
// to be rendered - whatever happens here this is where you send your response

print $response;
exit(0);

Вы не должны реализовывать маршрутизацию вашего контроллера просто из .htaccess.Вы должны просто сделать так, чтобы все запросы, кроме статических активов, шли в index.php.Затем на стороне php вы выясните, куда отправлять запрос, основываясь на шаблоне URL.

1 голос
/ 27 июля 2011

С вашим htaccess что-то не так, должно быть что-то вроде ...

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME}!-F 
RewriteCond %{REQUEST_FILENAME}!-D 

RewriteRule ^(.*)$ index.php/$1 [L, QSA] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...