今天配置了一下yii2 的路由,用 /index.php?r=... 這樣的路由,實在是不太習慣,因此我便試着把yii2 的路由,寫成laravel 那般,如下爲詳情php
1.環境介紹mysql
lnmp php5.6, mysql5.5, lnmp1.2 nginx
yii2-advancedlaravel
2.在 frontend/config/main.php 中,添加如下內容 web
'urlManager' => [ 'enablePrettyUrl' => true, //開啓URL美化 'showScriptName' => false, //禁用index.php文件 'rules' => require_once '../config/routes.php', //載入路由設置文件 routes.php ],
3.書寫 routes.php 文件,之因此使用文件這樣的格式,是爲了不main.php 文件過於冗餘sql
<?php return [ 'test.json' => 'demo/test', //未指定請求方式是,能夠爲如何方式,相似laravel 中的 any 'POST api-post' => 'demo/post-test', //POST 表示用post 方式請求, actionPostTest ==> post-test 'get-demo/<id:\d+>' => 'demo/get-id', //<id:\d+> 表示url中傳遞參數 id=?? ];
* api/test/test.json 爲訪問的url連接,demo/test 對應的是 控制器 DemoController 的 actionTest 方法json
* 至於該routes.php 更多的用法,能夠參考 laravel 的路由設置,在結合yii2 來進行api
4. 編寫 DemoController 控制器yii2
<?php namespace frontend\controllers; use Yii; use yii\web\Controller; /** * Site controller */ class DemoController extends Controller{ public $layout = false; //不使用佈局 public $enableCsrfValidation=false; //any www.yii2.com/test.json public function actionTest() { echo json_encode(['name'=>'zeopean']); } //post www.yii2.com/api-post public function actionPostTest() { echo json_encode(['name'=>'zeopean', 'method'=>'post']); } //any www.yii2.com/get-demo/12 public function actionGetId() { $request = Yii::$app->request; $id = $request->get('id'); echo json_encode(['id'=>$id]); } }
5. 若是你覺得這樣就能夠運行,那就錯了,你還須要在咱們的nginx 中稍做配置,具體以下app
location / { if (!-e $request_filename){ rewrite ^/(.*) /index.php last; } }
url的使用
echo \Yii::$app->urlManager->createUrl(['site/page', 'id' => 'about']); // /index.php/site/page/id/about/ echo \Yii::$app->urlManager->createUrl(['date-time/fast-forward', 'id' => 105]) // /index.php?r=date-time/fast-forward&id=105 echo \Yii::$app->urlManager->createAbsoluteUrl('blog/post/index'); // http://www.example.com/index.php/blog/post/index/
use yii\helpers\Url; // 當前活動路由 // /index.php?r=management/default/users echo Url::to(''); // 相同的控制器,不一樣的動做 // /index.php?r=management/default/page&id=contact echo Url::toRoute(['page', 'id' => 'contact']); // 相同模塊,不一樣控制器和動做 // /index.php?r=management/post/index echo Url::toRoute('post/index'); // 絕對路由,無論是被哪一個控制器調用 // /index.php?r=site/index echo Url::toRoute('/site/index'); // 區分大小寫的控制器動做 `actionHiTech` 的 url 格式 // /index.php?r=management/default/hi-tech echo Url::toRoute('hi-tech'); // 控制器和動做都區分大小寫的 url,如'DateTimeController::actionFastForward' : // /index.php?r=date-time/fast-forward&id=105 echo Url::toRoute(['/date-time/fast-forward', 'id' => 105]); // 從別名中獲取 URL // http://google.com/ Yii::setAlias('@google', 'http://google.com/'); echo Url::to('@google'); // 獲取當前頁的標準 URL // /index.php?r=management/default/users echo Url::canonical(); // 得到 home 主頁的 URL // /index.php?r=site/index echo Url::home(); Url::remember() ; // 保存URL以供下次使用 Url::previous(); // 取出前面保存的 URL
好了,這樣就能夠了