<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # `6.0`升級到`6.1`版本 由于安全性原因,`6.1`版本移除核心對`think-filesystem`庫的依賴,因此`6.0`版本升級至`6.1`版本后,需要單獨安裝`topthink/think-filesystem`庫。 # `5.1`升級到`6.0`版本 >[danger] 不建議老的項目升級到新版,除非你有重構計劃,否則就算升級了也只是表面上升級了。 > 本文主要用于指導開發者從`5.1`升級到`6.0`最新版本,由于`6.0`不支持`5.1`的無縫升級,下面的升級步驟和指導僅供學習參考,或有遺漏及考慮不周之處,因此不保證你的所有功能都能正常升級。 `6.0`版本必須使用`composer`安裝,所以你需要首先安裝新的`6.0`版本,然后把原來`5.1`的文件復制進去,完成升級工作。 ~~~cmd composer create-project topthink/think:6.0.0 tp ~~~ 安裝完成后,把原來`application`目錄下面的文件復制到`app`目錄下面,然后把`config`和`route`目錄下的文件復制到同名目錄下。接下來,按照下面的步驟來升級操作。 從`5.1`多模塊遷移到`6.0`的多應用后,應用類庫的命名空間原則上可以無需調整,但不再支持跨應用調用(包括路由及模板,每個應用的路由是獨立的),這點務必引起重視。如果你的應用根命名空間不是默認的`app`需要改成`app`。 [TOC=2,2] ## 第一步:應用配置 如果原來你使用了多模塊開發模式,直接改成新版的多應用模式是最簡單的,需要額外安裝多應用模式擴展。 ``` composer require topthink/think-multi-app ``` 如果你自定義了訪問控制器的名稱,需要修改`route.php`配置文件中的`controller_layer`值。 ``` // 訪問控制器層名稱 'controller_layer' => 'controller', ``` 如果你開啟了控制器類的后綴,需要設置`route.php`配置文件中的`controller_suffix`值。 ``` // 開啟控制器后綴 'controller_suffix' => true, ``` 如果自定義了空控制器的名稱,則需要設置`route.php`配置文件中的`empty_controller`值。 ``` // 空控制器名 'empty_controller' => 'Error', ``` ## 第二步:配置調整 請按照如下順序檢查及調整你的配置文件和相關配置代碼。 ### 應用的配置文件 如果是多應用的話,應用配置文件應當放入應用下的`config`目錄。全局配置文件位置無需調整。 ### 配置獲取調整 原來獲取一級配置參數的方式 ``` Config::pull('app'); ``` 需要改成 ``` Config::get('app'); ``` 所有的配置讀取必須從第一級配置開始,例如,原來的 ``` Config::get('exception_handle'); ``` 必須改成 ``` Config::get('app.exception_handle'); ``` ### 廢棄動態設置 動態更改配置參數的用法已經廢棄,下面的用法不再支持。 ``` Config::set('route.default_return_type', 'json'); ``` 如果你需要把數據庫的配置參數讀入配置,可以使用 ``` $config = Db::name('config')->column('value', 'name'); Config::set($config, 'route'); ``` ### `Config`類不再支持數組方式讀取 `Config`類不再使用`ArrayAccess`接口,因此不再支持數組方式讀取。 ### 路由和URL配置獨立 路由和URL請求相關的配置參數獨立為`route.php`配置文件,而不再使用`app.php`配置文件。 ## 第三步:路由和請求調整 ### 路由定義文件位置調整 單應用模式下,路由定義文件和之前一樣就在`route`目錄下面,如果你的項目是采用了多應用模式的話,每個應用的路由定義和匹配都是獨立的,也沒有模塊的概念,路由定義文件的位置應該是在`應用/route`下面,例如: ~~~ app/index/route/route.php // index應用的路由定義文件 app/index/route/web.php // index應用的第二個路由定義文件 app/admin/route/route.php // admin應用的路由定義文件 ~~~ > 應用的路由規則其實是定義的入口文件(或者應用名)后面的URL部分,而不包含應用。 ### 路由注冊方法調整 首先如果你的路由定義采用的是返回數組形式,全部改成方法定義。 例如: ~~~ return [ 'hello/:name' => 'index/hello', ]; ~~~ 必須改成: ~~~ Route::get('hello/:name', 'index/hello'); ~~~ 如果路由定義方法(包括`rule`/`get`/`post`/`put`/`delete`/`patch`/`miss`/`group`等方法)使用了`option`和`pattern`參數,全部改成方法調用形式,例如原來的: ~~~ Route::get('hello/:name', 'index/hello', [ 'ext' => 'html'], [ 'name' => '\w+']); ~~~ 需要改成 ~~~ Route::get('hello/:name', 'index/hello') ->ext('html') ->pattern([ 'name' => '\w+']); ~~~ ### 路由分組調整 如果路由分組定義使用了數組,改成閉包方式定義,例如: ~~~ Route::group('blog', [ ':id' => 'Blog/read', ':name' => 'Blog/read', ])->ext('html')->pattern(['id' => '\d+']); ~~~ 必須改成 ~~~ Route::group('blog', function() { Route::get(':id', 'Blog/read'); Route::get(':name', 'Blog/read'); })->ext('html')->pattern(['id' => '\d+']); ~~~ 如果你需要注冊一個虛擬的路由分組,可以直接在第一個參數使用閉包 ~~~ Route::group(function() { Route::get('blog/:id', 'Blog/read'); Route::get('user/:name', 'User/read'); })->ext('html')->pattern(['id' => '\d+']); ~~~ ### 取消了`url_controller_layer`配置 改為在`route.php`配置文件中使用`controller_layer`設置。 ### 取消`controller_suffix`配置 改為在`route.php`配置文件中使用`controller_suffix`設置。 同時`class_suffix`配置參數已經無效。 ### 取消`mergeExtraVars`方法和對應參數 改為在路由規則中明確指定變量規則。 ### `allowCrossDomain`方法參數調整 取消原來的第一個參數。 ### `header`方法取消 需要單獨改變Header信息的直接通過中間件統一處理。 ### 取消`Request`類的`hook`方法 該方法已經在最新版本中取消。如果你使用了該功能,在自定義請求對象`app\Request`中直接增加相應的方法即可。并確保`provider.php`文件中添加如下綁定: ``` 'think\Request' => \app\Request::class, ``` ### 取消`URL`參數模式配置 原來的URL參數模式配置參數`url_param_type`,統一使用參數/值的方式。如果你設置了該配置參數為1,必須改成定義路由的方式。 ### 取消別名路由 因為使用場景有限和性能開銷問題,取消原來的別名路由功能,建議使用資源路由或者單獨的路由替代。 ### 取消快捷路由 因為使用場景有限和不太符合規范,取消了原來的控制器快捷路由功能。 ### 取消空操作功能 建議使用分組MISS路由功能或者控制器的`__call`方法替代。 ## 第四步:控制器和視圖調整 ### `think\Controller`類取消 系統不再提供基礎控制器類`think\Controller`,原來的`success`、`error`、`redirect`和`result`方法需要自己在基礎控制器類里面實現。 系統默認在應用目錄下面提供了一個`app\BaseController`基礎類,或者你可以直接放入你的應用里面,繼承使用。 你可以安裝下面的擴展用于支持舊版本的跳轉操作 ~~~ composer require liliuwei/thinkphp-jump ~~~ ### 視圖和模板引擎從核心分離 模板引擎類不再內置到核心框架,但使用 ~~~ composer create-project topthink/think ~~~ 會默認安裝該組件(如果不需要使用的話可以自己卸載`topthink/think-view`)。 安裝后,由于內置的`think\Controller`類已經取消,如果你的控制器類需要調用`fetch`/`display`/`assign`等視圖方法,必須改為調用`think\facade\View`類,如果是使用`view`助手函數方式的話,可以無需調整。 ``` View::assign('name', $name); View::fetch(); ``` ### `share`方法取消 原來視圖類的`share`方法取消,可以使用 ``` think\facade\View::assign($vars); ``` ## 第五步:數據庫和模型調整 ### `Db`改為使用門面對象 新版的`Db`類不再是靜態類,需要使用`think\facade\Db`門面進行靜態代理。 ~~~ \think\facade\Db::name('user')->find(); ~~~ ### 數據庫配置信息調整 數據庫配置文件或者`connect`方法取消`DSN`數據庫配置定義方式,全部采用數組方式配置定義。 ~~~ Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8') ->table('user') ->find(); ~~~ 必須改成 ~~~ Db::connect('db_config') ->table('user') ->find(); ~~~ 并且按照新版的規范在數據庫配置文件中增加`db_config`連接信息。 ### 取消`fetchPdo`方法 取消了`Query`類的`fetchPdo`方法,需要的時候直接使用`getPdo`方法替代。 ### 取消查詢方法傳入`Query`對象 取消Query類的CURD查詢方法傳入當前對象,如果需要請使用閉包替代。 ### `insert`/`insertGetId`/`insertAll`方法取消`replace`參數 `insert`/`insertGetId`/`insertAll`方法的第二個`replace`參數已經取消,改為使用`replace`方法。 ~~~ $data = ['foo' => 'bar', 'bar' => 'foo']; Db::name('user')->insert($data, true); ~~~ 需要改為 ~~~ $data = ['foo' => 'bar', 'bar' => 'foo']; Db::name('user')->replace()->insert($data); ~~~ ### 取消`db`和`model`助手函數 這兩個助手函數`5.1`版本已經不再建議使用了,`6.0`版本已經廢棄掉這兩個助手函數,請直接使用`\think\facade\Db`類靜態方法和實際的模型類調用。 ### 取消`setInc`/`setDec`方法 取消Query類的`setInc`/`setDec`方法,統一使用`inc`/`dec`方法替代。例如: ~~~ Db::name('user')->where('id', 1) ->inc('exp') ->dec('score') ->update(); ~~~ ### 取消`join`方法的批量操作 `join`方法不再支持批量操作多個表,如果你使用了`join`方法批量操作,需要改成每個表單獨調用一次`join`方法。 ### 取消`setField`方法 取消Query類的`setField`方法,請直接使用`data`方法或者`update`方法。 ### 取消`__TABLE_NAME__`支持 `table`方法取消`__TABLE_NAME__`支持,必須明確調用完整表名或者使用`name`方法。 ### 取消`whereOr`等方法傳入`Query`對象 因為`Query`對象查詢只能使用一次,除了`where`方法本身可以傳入`Query`對象外,其它的所有`where`查詢方法(例如`whereOr`/`whereExp`等)都不再支持傳入`Query`對象。 ### 取消`resultset_type`配置參數 數據集查詢結果不再受`resultset_type`配置參數影響,默認情況下,Db查詢統一返回數組,模型查詢統一返回模型對象和模型數據集對象。如果Db查詢的時候也需要返回數據集的話,可以顯式調用`fetchCollection`方法。 ### 取消`Query`類的`extend`方法 取消了`Query`類的`extend`方法,如果需要擴展查詢方法,建議自定義`Query`類并繼承系統的`think\db\Query`類即可,然后在模型中定義`query`屬性或者配置數據庫連接的`query`參數為你的自定義類。 ### `Expression`對象調整 原來的`Expression`對象已經更改為更適合的`Raw`對象,但不影響`Db::raw()`方法的調用。 ### 取消查詢`eq/neq/gt/lt/egt/elt`表達式 由于存在兩種用法,并且不夠直觀,全部統一為更直觀的用法。 下面的用法不再支持 ~~~ Db::name('user')->where('id', 'egt', 1) ->where('status', 'neq' ,1) ->select(); ~~~ 統一使用 ~~~ Db::name('user')->where('id', '>=', 1) ->where('status', '<>' ,1) ->select(); ~~~ ### 取消分表功能 出于分表的性能問題和復雜性,不再提供分表方法,建議使用數據庫的分區功能替代。新版可以使用`partition`方法指定當前查詢的分區。 ### 數據庫的查詢統計合并 數據庫的查詢次數合并到`queryTimes`,不再區分讀寫操作,你可以使用下面的方法獲取當前請求的數據庫查詢次數(包括讀寫) ~~~ Db::getQueryTimes(); ~~~ ### 模型后綴 如果之前開啟了類庫后綴功能的話,你必須在模型類里面明確指定`name`屬性。 ### 取消了模型的`get`/`all`方法 無論使用`Db`類還是模型類查詢,全部統一使用`find`/`select`方法,取消了之前模型類額外提供的`get`/`all`方法。同時取消的方法還包括`getOrFail`/`allOrFail`。 ### 取消全局查詢范圍`base`方法 取消模型類的全局查詢范圍`base`方法,改由使用`globalScope`屬性定義(數組)需要全局查詢的查詢范圍方法。 ### 模型事件調整 模型事件不再需要使用`event`方法注冊事件,統一在模型類中定義事件方法,例如 ~~~ <?php namespace app\index\model; use think\Model; class User extends Model { public function onAfterRead($user) { $user->extra = 'extra'; } public function onBeforeWrite($user) { $user->extra = 'extra'; } } ~~~ 并且模型增加`after_read`事件,在查詢后創建模型對象實例的時候觸發。 ### 取消模型自動完成 模型的自動完成功能已經取消,請使用模型事件代替。 ### 模型`save`方法調整 模型類的`save`方法不再支持`where`參數。 ### 關聯統計調整 如果你的關聯統計使用了閉包方式返回關聯統計字段,需要調整為如下方式: ``` User::withCount(['cards' => function($query,&$name) { $query->where('status', 1); $name = 'card_count'; }])->select(); ``` ### 模型和數據集的輸出調整 取消`hidden`/`visible`/`append`方法的第二個參數,當你調用這幾個方法的時候,無論模型是否設置了相關屬性,都會直接覆蓋之前設置的值。 ### 查詢緩存調整 如果希望在更新和刪除之后自動清除之前的查詢緩存,必須在`cache`方法中傳入key值而不是`true`。 ### 刪除關聯類`selfRelation`方法 如果你在定義關聯的時候使用了`selfRelation`方法,請直接刪除該方法,目前已經不再需要,會自動識別是否為自關聯。 ### 刪除關聯類的`setEagerlyType`方法 一對一關聯無需在定義關聯的時候指定為`JOIN`查詢,在查詢的時候直接使用`withJoin`方法即可使用`JOIN`方式進行關聯查詢。 ### 多對多關聯 多對多關聯的`pivotDataName`方法更名為更簡單的`name`方法。 ## 第六步:行為調整 行為和`Hook`已經用新版的事件機制替代,需要把你的行為改成事件響應或者中間件(部分請求攔截的行為可以直接改為中間件)。 原來的系統內置鉤子的行為類 ~~~ <?php namespace app\index\behavior; class Hello { public function run($params) { // 行為邏輯 } } ~~~ 可以改成事件監聽類 ~~~ namespace app\index\listener; class Hello { public function handle($event) { // 事件監聽處理 } } ~~~ 然后在應用目錄的`event.php`文件中配置事件監聽。 ~~~ return [ 'listen' => [ 'AppInit' => ['\app\index\listener\Hello'], // 更多事件監聽 ], ]; ~~~ 修改完成后,你可以刪除應用目錄下不再使用的`tags.php`文件。 內置事件和鉤子的對應關系如下: | 事件| 對應`5.1`鉤子| 參數 | | --- | --- | --- | | `AppInit` | `app_init `| 無 | | `AppEnd` | `app_end `| 當前響應對象實例 | | `LogWrite` | `log_write `| 當前寫入的日志信息 | | `LogLevel` | `log_level `| 包含日志類型和日志信息的數組 | >[danger] 原來的`app_begin`、`response_send`、`response_end`、`action_begin`、`module_init`和`view_filter`鉤子已經廢棄。 ## 第七步:其它調整及注意事項 ### 系統`Facade`類庫別名取消 系統`Facade`類庫的別名已經取消,因此不能再使用 ``` use Route; Route::rule('hello/:name', 'index/hello'); ``` 必須使用 ``` use think\facade\Route; Route::rule('hello/:name', 'index/hello'); ``` ### `Session`調整 `Session`新版默認不開啟,必須為在全局中間件定義文件中添加 ~~~ 'think\middleware\SessionInit' ~~~ 原來的`Session::get()` 可以獲取全部的Session數據必須改成 `Session::all()` ### 嚴格類型檢查 由于新版框架核心類庫全面啟用強類型參數,并且使用嚴格模式,所以在調用系統方法的時候一定要注意參數的類型,或者注意看拋出的異常信息進行修正。 >[success] 最后,希望你的`6.0`升級之旅順利^_^ ,希望大家在升級和使用`6.0`的過程中,多反饋和建議,幫助我們盡快完善和發布正式版本。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看