urlManager - uniqcle/Yii2 GitHub Wiki

Принцип работы urlManager

Страница на сайта Адрес страницы Обработчик запроса Маршрут (route)
Главная / Метод actionIndex() в классе SiteController site/index
О компании /about Метод actionAbout() в классе SiteController site/about
Все новости /news Метод actionList() в классе NewsController news/list

Роль urlManager - это найти подходящий маршрут согласно правилам и передать работу в соответствующий обработчик. /frontend/config/main.php

# Прописываем маршруты
...
'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                 '/'     => 'site/index',
                 'about' => 'site/about'
                 'news'  => 'news/list'
            ],
        ],
...

urlManager Setup

Чтобы настроить urlManager, необходимо:

  1. Перенаправить все запросы на Front Controller (файл index.php) Apache Config

  2. Настроить компонент urlManager в конфигурации приложения /var/www/[site_name]/frontend/config/main.php

...
'rules' => [
                'novosti'  => 'news/list'
           ],
...

Пример работы с urlManager

В файле /frontend/config/main.php вносим правки 'novosti/<id:\d+>' => 'news/view' id будет поступать в Controller

'rules' => [
              'novosti' => 'news/index', 
              'novosti/<id:\d+>' => 'news/view'
            ],

В NewsController

namespace frontend\controllers; 

use yii\web\Controller; 
use frontend\models\News; 

class NewsController extends Controller 
{
	public function actionIndex(){
		
		$newsItems = News::getNews(); 

		return $this->render('index', [
			'newsItems' => $newsItems, 
		]); 

	}

	public function actionView($id){
 
		$item = News::getNewsItem($id); 

		return $this->render('view', [
			'item' => $item,
		]); 
	}
}

В модели News

namespace frontend\models; 
use Yii; 
class News 
{
	public static function getNews(){
		$sql = "SELECT * FROM news "; 

		return Yii::$app->db->createCommand($sql)->queryAll(); 
	}

	public static function getNewsItem($id){
		$sql = "SELECT * FROM news WHERE id=".$id; 

		return Yii::$app->db->createCommand($sql)->queryOne(); 
	}
}

В виде index

# Обычный способ
foreach($newsItems as $item):  
 <a href = "/novosti/<?=$item["id"]; ?>"> <?=$item['title']; ?> </a>  
 $item['content'];  
endforeach;
# Получаем адрес страницы по обработчику
echo Yii::$app->urlManager->createUrl(['news/index']);
# Получаем адрес страницы по обработчику с параметром
echo Yii::$app->urlManager->createUrl(['news/view', 'id' => $item['id']]); 

<a href = "<?php echo Yii::$app->urlManager->createUrl(['news/view', 'id' => $item['id']]);  ?> ">
  <?=$item['title']; ?> 
</a> 

В виде view

<h2><?=$item["title"]; ?></h2>
<p><?=$item["content"]; ?></p>

<a href = "<?php echo Yii::$app->urlManager->createUrl(['news/index']) ?>">Назад</a>

или с использованием helpers

use yii\helpers\Url; 

<a href = "<?php echo Url::to(['news/index']) ?>">Назад</a>
⚠️ **GitHub.com Fallback** ⚠️