1. 程式人生 > >thinkphp5.0學習(四):入口檔案、路由模式、路由設定和url生成

thinkphp5.0學習(四):入口檔案、路由模式、路由設定和url生成

一、路由的作用

  • 簡化URL地址,方便記憶
  • 有利於搜尋引擎的優化

二、入口檔案

前後臺分離

  • 在網站public目錄下(專案\public)新建admin.php
  • 開啟admin.php

    <?php
    // +----------------------------------------------------------------------
    // | ThinkPHP [ WE CAN DO IT JUST THINK ]
    // +----------------------------------------------------------------------
    // | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
    // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <[email protected]> // +----------------------------------------------------------------------
    // [ 應用入口檔案 ] // 定義應用目錄 define('APP_PATH', __DIR__ . '/../application/'); // 載入框架引導檔案 require __DIR__ . '/../thinkphp/start.php';

繫結模組

  • 實現功能
    index.php 這個入口檔案,只能去前臺模組
    admin.php這個入口檔案,只能去後臺模組(建議後臺入口檔案複雜一些)

  • 如何實現
    在入口檔案中

    // 定義前臺
    define('BIND_MODULE', 'index'); 
    // 繫結後臺
    define('BIND_MODULE', 'admin');

隱藏入口檔案

  • 開啟apache重寫(D:\wamp64\bin\apache\apache2.4.23\conf\httpd.conf)
    把註釋開啟 LoadModule rewrite_module modules/mod_rewrite.so

  • 設定訪問許可權(D:\wamp64\bin\apache\apache2.4.23\conf\extra\httpd-vhosts.conf)

    <VirtualHost *:80>
        ServerName www.tp.com
        DocumentRoot D:/wamp64/www/study/thinkphpstudy/public
        <Directory  "D:/wamp64/www/study/thinkphpstudy/public">
            Options +Indexes +Includes +FollowSymLinks +MultiViews
            AllowOverride All
            Require all granted
        </Directory>
    </VirtualHost>
  • 入口檔案,在網站public目錄下新建.htaccess檔案,

    <IfModule mod_rewrite.c>
      Options +FollowSymlinks -Multiviews
      RewriteEngine On
    
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
    </IfModule>
    
  • 重啟服務

三、tp5.0路由學習注意

  • 支援三種方式的url解析規則
  • 路由只針對應用,不針對模組,因此路由的設定也是針對應用下的所有模組。
  • 關閉後臺模組,在後臺入口檔案中(admin.php),寫在載入框架引導檔案之後,否則報錯。

    <?php
    // +----------------------------------------------------------------------
    // | ThinkPHP [ WE CAN DO IT JUST THINK ]
    // +----------------------------------------------------------------------
    // | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
    // +----------------------------------------------------------------------
    // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
    // +----------------------------------------------------------------------
    // | Author: liu21st <[email protected]>
    // +----------------------------------------------------------------------
    
    // [ 應用入口檔案 ]
    
    // 定義應用目錄
    define('APP_PATH', __DIR__ . '/../application/');
    // 繫結後臺
    define('BIND_MODULE', 'admin');
    // 載入框架引導檔案
    require __DIR__ . '/../thinkphp/start.php';
    
    // 關閉admin模組的路由
    \think\App::route(false);
    

路由的三種模式

普通模式

  • 1.定義
    關閉路由,完全使用預設的PATH_INFO方式URL:
  • 3.如何設定

         // 是否開啟路由
        'url_route_on'           => false,
        // 是否強制使用路由
        'url_route_must'         => false,

混合模式

  • 1.定義
    開啟路由,並使用路由定義+預設PATH_INFO方式的混合
  • 2.如何設定

         // 是否開啟路由
        'url_route_on'           => true,
        // 是否強制使用路由
        'url_route_must'         => false,
    

強制模式

  • 1.定義
    開啟路由,並設定必需定義路由才能訪問
  • 2.如何設定

         // 是否開啟路由
        'url_route_on'           => true,
        // 是否強制使用路由
        'url_route_must'         => true,

四、設定路由

1.動態單個註冊

  • 設定路由格式

    Route::rule(‘路由表示式’, ‘路由地址’, ‘請求型別’, ‘路由引數(陣列)’, ‘變數規則(陣列)’)

  • 設定路由檔案(專案\application\route.php)

  • 如何設定(route.php)

    use think\Route;
    // 定義路由規則
    // 設定路由之後,就不能使用pathinfo訪問了
    Route::rule('/','index/index/index');
    //註冊路由訪問到index模組下的index控制器下的index的方法
    Route::rule('test','index/index/test');
    //註冊路由test 訪問到index模組下的index控制器下的test的方法
  • 路由的形式
    1、靜態地址路由

    //註冊路由test 訪問到index模組下的index控制器下的test的方法
    Route::rule('test','index/index/test');

    2、給路由帶引數

    route.php//註冊帶引數路由
    //http://www.tp.com/course/1
    //http://www.tp.com/index/index/index/id/1
    Route::rule('course/:id','index/index/course');
    index.php中
    function course(){
                return input('id');
            }

    3、給路由帶多個引數(設定了帶幾個就必需帶幾個)

    route.php//註冊帶引數路由
    //http://www.tp.com/time/1/2
    //http://www.tp.com/index/index/shijian/year/1/month/2
    Route::rule('time/:year/:month','index/index/shijian');
    index.php中
    function shijian(){
            return input('year').input('month');
        }

    4、可選引數路由

    route.php//註冊帶可選引數路由
    //http://www.tp.com/time/1
    //http://www.tp.com/index/index/shijian/year/1
    Route::rule('time/:year/[:month]','index/index/shijian');
    index.php中
    function shijian(){
            return input('year').input('month');
        }

    5、全動態路由(不建議使用)

        route.php//註冊帶可選引數路由
        //http://www.tp.com/1/1
        //http://www.tp.com/index/index/dongtai/1/1
        Route::rule(':a/:b','index/index/dongtai');
        index.php中
        function dongtai(){
            return input('a').input('b');
        }

    6、完全匹配路由

        route.php//註冊帶可選引數路由
        //http://www.tp.com/1/1
        //http://www.tp.com/index/index/dongtai/1/1
        Route::rule(':a/:b$','index/index/dongtai');
        index.php中
        function dongtai(){
            return input('a').input('b');
        }

    7、帶額外引數

        route.php// 帶額外引數
        Route::rule('test2','index/index/test2?id=10&name=tian');
        index.php中
        function test2(){
            dump(input());
        }
  • 設定請求型別
    1.TP中請求型別
    get,post,put,delete
    2.Route::rule() 預設支援所有型別
    3.設定各種請求

    // 支援get請求的兩種方式
    Route::rule('type','index/index/type','get');
    Route::get('type','index/index/type');
    // 支援post請求的兩種方式
    Route::rule('type','index/index/type','post');
    Route::post('type','index/index/type');
    // 同時支援get和post
    Route::rule('type','index/index/type','get|post');
    // 支援所有路由
    Route::rule('type','index/index/type','*');
    Route::any('type','index/index/type' );
    // 支援put請求
    Route::rule('type','index/index/type','put');
    Route::put('type','index/index/type' );
    // 支援delete請求
    Route::rule('type','index/index/type','delete');
    Route::delete('type','index/index/type' );

    4.如何模擬put和delete請求

    <form action="type" method="post">
        <p>
            <input type="hidden" name="_method" value="PUT" />
            <input type="text" name="name" id="" />
        </p >
        <p>
            <input type="submit" value="提交" />
        </p >
    </form>

2.設定路由-動態批量註冊

1.基本格式

    Route::rule([
        '路由規則1'=>'路由地址和引數',
        '路由規則2'=>['路由地址和引數','匹配引數(陣列)','變數規則(陣列)'],
        ...
    ],'','請求型別','匹配引數(陣列)','變數規則');

2.使用

// 動態批量註冊
Route::rule([
        "index"=>"index/index/index",
        "diaoyong"=>"index/index/diaoyong",
        "type/:id"=>"index/index/type"
    ],'','get');
Route::get([
        "index"=>"index/index/index",
        "diaoyong"=>"index/index/diaoyong",
        "type/:id"=>"index/index/type"
    ]);

3.設定路由-配置檔案批量註冊

return [
    "index"=>"index/index/index",
    "diaoyong"=>"index/index/diaoyong",
    "type/:id"=>"index/index/type"
];

五、變數規則

Route::rule(‘路由表示式’,’路由地址’,’請求型別’,’路由引數(陣列)’,’變數規則(陣列)’);

// ['id'=>'\d{1,3}','name'=>'\w+']設定路由變數規則,id只能是1-3位數字,name只能是hi字串
Route::rule("course/:id/:name","index/index/course",'get',[],['id'=>'\d{1,3}','name'=>'\w+']);

六、路由引數

路由引數是指可以設定一些路由匹配的條件引數,主要用於驗證當前的路由規則是否有效,主要包括:

Route::rule('course/:id/:name','index/index/course','get',['method'=>'get','ext'=>'html'],['id'=>'\d{1,3}','name'=>'\w+']);
// 路由引數method 請求方式必需是get
// 路由引數ext 主要設定路由的字尾

引數  說明
method  請求型別檢測,支援多個請求型別
ext URL字尾檢測,支援匹配多個字尾
deny_ext    URL禁止字尾檢測,支援匹配多個字尾
https   檢測是否https請求
domain  域名檢測
before_behavior 前置行為(檢測)
after_behavior  後置行為(執行)
callback    自定義檢測方法
merge_extra_vars    合併額外引數
bind_model  繫結模型(V5.0.1+)
cache   請求快取(V5.0.1+)
param_depr  路由引數分隔符(V5.0.2+)
ajax    Ajax檢測(V5.0.2+)
pjax    Pjax檢測(V5.0.2+)

七、資源路由

1.宣告

Route::resource(‘blog’,’index/blog’);

也可以在定義資源路由的時候限定執行的方法(標識),例如:

Route::resource('blog','index/blog',['only'=>['index','read','edit','update']]);
Route::resource('blog','index/blog',['except'=>['index','delete']]);

2.會動註冊7個路由規則(一定要記憶)

標識 請求型別 生成路由規則 對應操作方法(預設)
index GET blog index
create GET blog/create create
save POST blog save
read GET blog/:id read
edit GET blog/:id/edit edit
update PUT blog/:id update
delete DELETE blog/:id delete

八、快捷路由

1.宣告

// 宣告快捷路由
Route::controller('blog','index/blog');

2.控制器

class Blog
{
    public function geta(){
        echo 'aaaaaaaaa';
    }
}

3.url訪問

九、url生成

1.系統類

dump(Url::build('index/index/index'));

2.系統方法

dump(url('index/index/index'));

3.使用

public function index()
    {
        echo '我是blog控制器index方法';
        dump(Url::build('index/index/index'));
        dump(url('index/index/index'));

        dump(Url::build('index/index/test'));
        dump(url('index/index/test'));

        dump(Url::build('index/index/course/id/10'));
        dump(url('index/index/course/id/10'));
        //
        dump(Url::build('index/index/abc',['id'=>10,'name'=>'張三']));
        dump(url('index/index/abc',['id'=>10,'name'=>'張三']));
        dump(url('index/index/abc','id=10&name=100'));

        //帶錨點
        dump(url('index/blog/read#name','id=5'));
        dump(url('index/blog/read#name',['id'=>5,'name'=>'100']));
        // 帶域名
        dump(Url::build('index/blog/read#[email protected]','id=5'));
        dump(url('index/blog/read#[email protected]',['id'=>5,'name'=>'100']));
        http://blog.tp.com/blog/read/id/5/name/100.html#anchor

        // 加上入口檔案
        Url::root('/index.php');
        dump(url('index/blog/read#[email protected]',['id'=>5,'name'=>'100']));
        //http://blog.tp.com/index.php/blog/read/id/5/name/100.html#anchor

    }