我的 ide 輸入了幾個不同的命名空間來在我的控制器中呈現視圖,我不確定應該使用哪一個:
class PostsController extends Controller
{
public function index() : View
{
return view('posts.index');
}
}
“view”函式回傳多種型別:
@return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
- 那么我應該使用哪一個?\Illuminate\Contracts\View\View 或 \Illuminate\Contracts\View\Factory
- 有什么區別?
- 為什么它回傳兩種不同的型別而不是一種?我以嚴格的方式撰寫 php 代碼,因為我更喜歡它的可讀性和不易出錯的代碼,在我看來,這是一種不好的方式,正如你所看到的那樣會造成混亂;一個方法應該只允許一個回傳型別,如果需要,創建多個方法。
編輯
謝謝大家的投入,我想出了以下內容,使我可以使用外觀和合同而不會在我的 ide 中產生 typhint 錯誤:
<?php
namespace App\Http\Controllers;
use Illuminate\Contracts\View\View as ViewContract;
use Illuminate\Support\Facades\View as ViewFacade;
/**
* Class PostsController
* @package App\Http\Controllers
*/
class PostsController extends Controller
{
/**
* @return ViewContract
*/
public function index() : ViewContract
{
return ViewFacade::make('posts.index');
}
}
所以我可以呼叫 View:make() 并回傳 View:make() 回傳的合同。
編輯 2
使用 view() 助手我可以進一步壓縮,我使用 ViewContract 別名只是為了我知道我正在使用哪個命名空間:
<?php
namespace App\Http\Controllers;
use Illuminate\Contracts\View\View as ViewContract;
/**
* Class PostsController
* @package App\Http\Controllers
*/
class PostsController extends Controller
{
/**
* @return ViewContract
*/
public function index() : ViewContract
{
return view('posts.index');
}
}
uj5u.com熱心網友回復:
我會嘗試解決你的每一個問題。
- 在您的實體中,型別提示
Illuminate\Contracts\View\View或具體實作 (Illuminate\View\View)。 - 我將在 3 中介紹這一點。
- 您正在使用
view全域輔助函式。它可以回傳不同的型別,因為它可以。如果您不傳遞引數,view()那么它將回傳一個視圖工廠實體。如果您確實傳遞了一個引數(就像您在使用中所使用的那樣),那么它將回傳一個由第一個引數命名的視圖實體(如果存在這樣的視圖)。這就是為什么要view()鍵入幫助函式以回傳多種不同型別的原因。因為根據您使用它的方式,它可以回傳不同的型別。
uj5u.com熱心網友回復:
你的意思是:\Illuminate\View\View。
public function index(): \Illuminate\View\View
{
return view('posts.index');
}
uj5u.com熱心網友回復:
view()是Illuminate\Support\Facades\View外觀的助手。
return view('posts.index');
與...一樣 :
use Illuminate\Support\Facades\View;
return View::make('posts.index');
請參閱創建和渲染視圖的檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419100.html
標籤:
