国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
什么是會(huì)話?
會(huì)話在 Laravel 中如何工作?
在 Laravel 中使用會(huì)話
# 從會(huì)話讀取數(shù)據(jù)
# 將數(shù)據(jù)寫入會(huì)話
# 將數(shù)據(jù)推送到會(huì)話中的數(shù)組
# 增加和減少會(huì)話中的數(shù)據(jù)
# 從會(huì)話中刪除數(shù)據(jù)
# 檢查會(huì)話中是否存在數(shù)據(jù)
# 將數(shù)據(jù)閃存到會(huì)話
輔助函數(shù)、門面或請求類?
更進(jìn)一步
# 會(huì)話鍵中的錯(cuò)字
# 會(huì)話鍵沖突
# 未知數(shù)據(jù)類型
# 在會(huì)話類中處理會(huì)話數(shù)據(jù)
在 Laravel 中測試會(huì)話
結(jié)論
首頁 后端開發(fā) php教程 深入研究拉拉維爾的會(huì)議

深入研究拉拉維爾的會(huì)議

Mar 06, 2025 am 02:32 AM

A Deep Dive into Sessions in Laravel

在構(gòu)建 Laravel 應(yīng)用程序時(shí),幾乎可以肯定您會(huì)在某些時(shí)候需要處理會(huì)話。它們是 Web 開發(fā)的基礎(chǔ)部分。

本文將快速介紹會(huì)話是什么,它們?nèi)绾卧?Laravel 中工作,以及您如何在 Laravel 應(yīng)用程序中使用它們。

然后,我們將更進(jìn)一步,深入探討如何使用“會(huì)話類”與會(huì)話交互,以避免我在處理 Laravel 應(yīng)用程序時(shí)經(jīng)常遇到的常見陷阱。

最后,我們將了解如何在 Laravel 中測試會(huì)話數(shù)據(jù)。

什么是會(huì)話?


默認(rèn)情況下,Web 應(yīng)用程序是無狀態(tài)的,這意味著請求通常彼此不了解。因此,我們需要一種方法來存儲請求之間的數(shù)?據(jù)。例如,當(dāng)用戶登錄網(wǎng)站時(shí),我們需要記住他們在訪問期間已登錄。這就是會(huì)話的用武之地。

簡而言之,會(huì)話是一種在多個(gè)請求之間持久保存數(shù)據(jù)安全的方式。

會(huì)話數(shù)據(jù)可能用于存儲以下內(nèi)容:

  • 用戶身份驗(yàn)證狀態(tài)。
  • 可在另一頁訪問的臨時(shí)數(shù)據(jù)。
  • 顯示給用戶的閃存消息。

會(huì)話數(shù)據(jù)可以存儲在各種位置,例如:

  • Cookie
  • 數(shù)據(jù)庫
  • 緩存存儲(例如 Redis)

會(huì)話在 Laravel 中如何工作?


要了解會(huì)話是什么,讓我們看看它們?nèi)绾卧?Laravel 中工作。

以下是您可能在 Laravel 應(yīng)用程序的會(huì)話中找到的一些示例數(shù)據(jù):

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

讓我們分解每個(gè)鍵可能代表的內(nèi)容。

以下鍵由 Laravel 框架本身添加:

  • _token 值用于防止 CSRF 攻擊。
  • _previous.url 值用于存儲先前請求的 URL。
  • _flash.old 值用于存儲先前請求中閃存會(huì)話數(shù)據(jù)的鍵。在本例中,它表示在先前請求中閃存了 success 值。
  • _flash.new 值用于存儲當(dāng)前請求中閃存會(huì)話數(shù)據(jù)的鍵。

以下鍵由我添加:

  • success 值用于存儲可能顯示給用戶的成功消息。
  • current_team_id 值用于存儲用戶正在查看的當(dāng)前團(tuán)隊(duì)的 ID。

默認(rèn)情況下,Laravel 支持以下會(huì)話驅(qū)動(dòng)程序:

  • cookie - 會(huì)話數(shù)據(jù)存儲在安全且加密的 Cookie 中。
  • database - 會(huì)話存儲在您的數(shù)據(jù)庫中(例如 MySQL、PostgreSQL、SQLite)。
  • memcached / redis - 會(huì)話數(shù)據(jù)存儲在這些快速的緩存存儲中。
  • dynamodb - 會(huì)話數(shù)據(jù)存儲在 AWS DynamoDB 中。
  • file - 會(huì)話數(shù)據(jù)存儲在 storage/framework/sessions 中。
  • array - 會(huì)話數(shù)據(jù)存儲在內(nèi)存中的 PHP 數(shù)組中,不會(huì)持久保存。

其中一些驅(qū)動(dòng)程序有設(shè)置要求。因此,在使用它們之前,務(wù)必檢查 Laravel 文檔以了解如何設(shè)置它們。

在 Laravel 中使用會(huì)話


Laravel 使使用會(huì)話變得非常簡單。文檔很好地解釋了如何與會(huì)話交互。但是,讓我們快速回顧一下基礎(chǔ)知識。

對于我們的示例,我們將假設(shè)我們正在構(gòu)建一個(gè)跨越多個(gè)頁面的分步向?qū)?。我們將存儲?dāng)前步驟以及每個(gè)步驟中輸入的數(shù)據(jù)到會(huì)話中。這樣,當(dāng)用戶完成所有步驟時(shí),我們可以在向?qū)ЫY(jié)束時(shí)讀取所有提交的數(shù)據(jù)。

為了使示例簡單,我們還將使用 session() 輔助函數(shù)。但稍后我們將討論使用 Session 門面或請求類訪問會(huì)話數(shù)據(jù)。

# 從會(huì)話讀取數(shù)據(jù)

要從會(huì)話讀取數(shù)據(jù),您可以使用 get 方法,如下所示:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

運(yùn)行上述代碼將返回為 wizard:current_step 鍵存儲在會(huì)話中的值。如果該鍵在會(huì)話中沒有存儲的值,它將返回 null

此方法還允許您定義一個(gè)默認(rèn)值,如果鍵不存在則返回:

<code>$currentStep = session()->get(key: 'wizard:current_step');</code>

運(yùn)行上述代碼將返回為 wizard:current_step 鍵存儲在會(huì)話中的值。如果該鍵在會(huì)話中沒有存儲的值,它將返回 1

還可能有一些時(shí)候您想從會(huì)話讀取數(shù)據(jù)并同時(shí)將其刪除(因此無法再次訪問)。您可以為此使用 pull 函數(shù):

<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

運(yùn)行上述代碼將返回為 wizard:current_step 鍵存儲在會(huì)話中的值,然后將其從會(huì)話中刪除。

# 將數(shù)據(jù)寫入會(huì)話

要將數(shù)據(jù)寫入會(huì)話,您可以使用 put 函數(shù),如下所示:

<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

運(yùn)行上述代碼將把數(shù)組(在第二個(gè)參數(shù)中傳遞)存儲為 wizard:step_one:form_data 鍵的值。

# 將數(shù)據(jù)推送到會(huì)話中的數(shù)組

類似地,您還可以使用 push 方法將數(shù)據(jù)推送到會(huì)話中的數(shù)組:

<code>session()->put(
    key: 'wizard:step_one:form_data',
    value: [
        'name' => 'Ash Allen',
        'email' => 'ash@example.com',
    ],
);</code>

假設(shè) wizard:step_one:form_data:languages 鍵具有以下數(shù)據(jù):

<code>session()->push(
    key: 'wizard:step_one:form_data:languages',
    value: 'javascript',
);</code>

上述代碼(調(diào)用 push 方法)將更新會(huì)話值:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

如果 wizard:step_one:form_data:languages 值尚不存在于會(huì)話中,則使用 push 將創(chuàng)建會(huì)話鍵并將值設(shè)置為包含您傳入的值的數(shù)組。

# 增加和減少會(huì)話中的數(shù)據(jù)

Laravel 還提供了一些方便的輔助方法,允許您增加和減少會(huì)話中的值:

您可以像這樣增加會(huì)話中的值:

<code>$currentStep = session()->get(key: 'wizard:current_step');</code>

當(dāng)我們運(yùn)行上面的代碼時(shí),如果 wizard:current_step 會(huì)話值為 3,它現(xiàn)在將增加到 4。

您還可以像這樣減少會(huì)話中的值:

<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

如果值尚不存在于會(huì)話中,則將它們視為 0。因此,對空會(huì)話值調(diào)用 increment 將值設(shè)置為 1。對空會(huì)話值調(diào)用 decrement 將值設(shè)置為 -1。

這兩種方法都允許您指定要增加或減少的數(shù)量:

<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

# 從會(huì)話中刪除數(shù)據(jù)

您還可以使用 forget 方法從會(huì)話中刪除數(shù)據(jù):

<code>session()->put(
    key: 'wizard:step_one:form_data',
    value: [
        'name' => 'Ash Allen',
        'email' => 'ash@example.com',
    ],
);</code>

運(yùn)行上述代碼將從會(huì)話中刪除屬于 wizard:current_step 鍵的數(shù)據(jù)。

如果您想一次刪除多個(gè)鍵,您可以將鍵數(shù)組傳遞給 forget 函數(shù):

<code>session()->push(
    key: 'wizard:step_one:form_data:languages',
    value: 'javascript',
);</code>

或者,如果您希望從會(huì)話中刪除所有數(shù)據(jù),您可以使用 flush 函數(shù):

<code>[
    `php`,
]</code>

# 檢查會(huì)話中是否存在數(shù)據(jù)

Laravel 還提供了一些方便的輔助函數(shù)來檢查會(huì)話中是否存在數(shù)據(jù)。

您可以使用 has 方法檢查會(huì)話中是否存在鍵以及其值是否不是 null

<code>[
    `php`,
    `javascript`,
]</code>

如果值存在且不是 null,則上述代碼將返回 true。如果值為 null 或鍵不存在,它將返回 false

類似地,您還可以使用 exists 方法檢查會(huì)話中是否存在鍵(無論值是否為 null):

<code>session()->increment(key: 'wizard:current_step');</code>

您還可以檢查會(huì)話中是否根本不存在會(huì)話:

<code>session()->decrement(key: 'wizard:current_step');</code>

# 將數(shù)據(jù)閃存到會(huì)話

可能有時(shí)您想在會(huì)話中持久保存一些數(shù)據(jù),但僅限于下一個(gè)請求。例如,您可能希望在用戶提交表單后向用戶顯示成功通知。

為此,您可以使用 flash 方法:

<code>session()->increment(key: 'wizard:current_step', amount: 2);
session()->decrement(key: 'wizard:current_step', amount: 2);</code>

如果您要運(yùn)行上述代碼,在下一次請求中,您可以從會(huì)話中讀取該值(使用類似 session()->get('success') 的內(nèi)容)進(jìn)行顯示。然后將其刪除,以便在下一次請求中不可用。

可能有時(shí)您有一些閃存數(shù)據(jù)(在先前的請求中添加),并且您想將其保留到下一個(gè)請求。

您可以使用 reflash 方法刷新所有閃存數(shù)據(jù):

<code>session()->forget(keys: 'wizard:current_step');</code>

或者,如果您只想保留一些閃存數(shù)據(jù),您可以使用 keep 方法:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

運(yùn)行上述代碼將保留 successerror 閃存會(huì)話值,但會(huì)刪除下一個(gè)請求的任何其他閃存數(shù)據(jù)。

輔助函數(shù)、門面或請求類?


到目前為止,我們只在示例中使用了 session() 輔助函數(shù)。

但您也可以使用 IlluminateSupportFacadesSession 門面或 IlluminateHttpRequest 類與會(huì)話交互。

無論您使用哪種方法,您仍然可以使用本文前面介紹的相同方法。這些方法只是與會(huì)話數(shù)據(jù)交互的不同方式。

要使用 Session 門面,您可以像這樣調(diào)用方法:

<code>$currentStep = session()->get(key: 'wizard:current_step');</code>

或者,您可以通過調(diào)用注入到控制器方法中的 IlluminateHttpRequest 實(shí)例上的 session 方法來訪問會(huì)話。假設(shè)您有如下控制器方法:

<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

每種方法都是完全有效的,因此您可以決定您和您的團(tuán)隊(duì)更喜歡哪一種。

更進(jìn)一步


對于較小的項(xiàng)目,使用我們前面討論過的方法與會(huì)話交互是完全可以的。但是,隨著 Laravel 項(xiàng)目的增長,您可能會(huì)遇到一些問題,這些問題會(huì)導(dǎo)致錯(cuò)誤并使您的代碼更難以維護(hù)。

因此,我們現(xiàn)在將介紹一些潛在的陷阱以及如何避免它們。

# 會(huì)話鍵中的錯(cuò)字

我看到的一個(gè)常見陷阱(我自己也經(jīng)歷過很多次)是會(huì)話鍵中的錯(cuò)字。

堅(jiān)持使用我們的向?qū)纠?,假設(shè)我們要將當(dāng)前步驟存儲在會(huì)話中。因此,我們的代碼可能如下所示:

<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

然后稍后,在代碼庫的不同部分,我們可能想從會(huì)話中讀取當(dāng)前步驟:

<code>session()->put(
    key: 'wizard:step_one:form_data',
    value: [
        'name' => 'Ash Allen',
        'email' => 'ash@example.com',
    ],
);</code>

您看到我剛才犯的錯(cuò)誤了嗎?我意外地嘗試讀取 wizard:step 鍵而不是 wizard:current_step 鍵。

這是一個(gè)簡單的示例,但在大型代碼庫中,很容易犯這種錯(cuò)誤。這些顯而易見的錯(cuò)誤也可能是最難發(fā)現(xiàn)的。

因此,避免這些錯(cuò)字的一種有用方法是使用常量或方法來生成會(huì)話鍵。

例如,如果會(huì)話鍵是靜態(tài)的,您可以定義一個(gè)常量(可能在稍后我們將介紹的會(huì)話類中),如下所示:

<code>session()->push(
    key: 'wizard:step_one:form_data:languages',
    value: 'javascript',
);</code>

這意味著我們減少了在代碼庫中使用的原始字符串的數(shù)量,這有助于減少錯(cuò)字的數(shù)量。

但是,有時(shí)您可能需要?jiǎng)討B(tài)生成會(huì)話鍵。例如,假設(shè)我們希望我們的 wizard:current_step 鍵包含一個(gè)團(tuán)隊(duì) ID 字段。我們可以創(chuàng)建一個(gè)方法來生成密鑰,如下所示:

<code>[
    `php`,
]</code>

正如我們在上面的代碼中看到的,我們正在動(dòng)態(tài)生成會(huì)話鍵,以便它可以在不同的方法中使用。例如,如果我們試圖查找 ID 為 1 的團(tuán)隊(duì)的當(dāng)前步驟,則密鑰將是 wizard:1:current_step。

# 會(huì)話鍵沖突

我在處理存在一段時(shí)間的項(xiàng)目時(shí)看到的另一個(gè)陷阱是會(huì)話鍵沖突。

例如,想象一下,幾年前您構(gòu)建了一個(gè)用于創(chuàng)建新用戶帳戶的向?qū)?。因此,您可能像這樣存儲會(huì)話數(shù)據(jù):

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

現(xiàn)在,您已被分配構(gòu)建一個(gè)也具有向?qū)У男鹿δ?,并且您完全忘記了舊的向?qū)Ш湍褂玫拿s定。您可能會(huì)意外地為新向?qū)褂孟嗤逆I,導(dǎo)致數(shù)據(jù)沖突并引入潛在的錯(cuò)誤。

為了避免這種情況,我喜歡用功能名稱作為會(huì)話鍵的前綴。因此,對于保存用于創(chuàng)建新用戶的向?qū)?shù)據(jù),我可能有以下鍵:

  • new_user_wizard:current_step
  • new_user_wizard:step_one:form_data
  • new_user_wizard:step_two:form_data
  • 等等...

然后在我的用于創(chuàng)建新團(tuán)隊(duì)的新向?qū)е校铱赡苡幸韵骆I:

  • new_team_wizard:current_step
  • new_team_wizard:step_one:form_data
  • new_team_wizard:step_two:form_data
  • 等等...

我們將在本文后面介紹如何在會(huì)話類中添加這些前綴。

# 未知數(shù)據(jù)類型

你能告訴我此會(huì)話值中存儲的數(shù)據(jù)類型是什么嗎?

<code>$currentStep = session()->get(key: 'wizard:current_step');</code>

如果您猜到它是一個(gè) AppDataTransferObjectsWizardsFormData 實(shí)例,那么您是對的。

說笑歸說笑,我想說明的是,當(dāng)您從會(huì)話中讀取數(shù)據(jù)時(shí),并不總是立即清楚您正在使用什么類型的數(shù)據(jù)。您最終必須查看將數(shù)據(jù)寫入會(huì)話的代碼才能弄清楚它是什么。這可能會(huì)分散注意力且耗時(shí),并可能導(dǎo)致錯(cuò)誤。

您可以向讀取會(huì)話數(shù)據(jù)的代碼添加注釋或文檔塊。但這只是一個(gè)提示。如果注釋沒有保持最新(如果會(huì)話數(shù)據(jù)類型發(fā)生更改),那么它就沒有幫助,并且會(huì)增加錯(cuò)誤的可能性。

我喜歡使用的另一種方法是在方法內(nèi)部讀取會(huì)話數(shù)據(jù)并向該方法添加返回類型。這樣,您可以確保您正在使用的數(shù)據(jù)類型正確。它還有助于您的 IDE 和閱讀代碼的人員。

例如,讓我們來看這段代碼:

<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

我們現(xiàn)在可以立即看到 stepOneFormData 方法返回一個(gè) AppDataTransferObjectsWizardsFormData 實(shí)例。這清楚地說明了我們正在使用的數(shù)據(jù)類型。然后,我們可以在控制器中像這樣調(diào)用此方法:

<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

# 在會(huì)話類中處理會(huì)話數(shù)據(jù)

正如我們在前面幾節(jié)中看到的,在 Laravel 中使用會(huì)話時(shí),有一些很容易避免(但很常見)的陷阱。

通過使用“會(huì)話類”,可以避免(或至少減少)這些陷阱中的每一個(gè)。我喜歡使用會(huì)話類來在一個(gè)地方封裝與單個(gè)功能相關(guān)的會(huì)話數(shù)據(jù)處理邏輯。

例如,假設(shè)我們有一個(gè)用于創(chuàng)建用戶和另一個(gè)用于創(chuàng)建團(tuán)隊(duì)的向?qū)?。我將為這些向?qū)е械拿恳粋€(gè)創(chuàng)建一個(gè)會(huì)話類:

  • AppSessionsUsersNewUserWizardSession
  • AppSessionsTeamsNewTeamWizardSession

通過使用會(huì)話類,您可以:

  • 自動(dòng)使用功能名稱作為所有鍵的前綴。
  • 向方法添加類型提示和返回類型。
  • 減少代碼庫中使用的原始字符串的數(shù)量。
  • 使重構(gòu)會(huì)話數(shù)據(jù)結(jié)構(gòu)更容易。
  • 使測試會(huì)話數(shù)據(jù)更容易。
  • 確切地知道如果需要對給定功能的會(huì)話數(shù)據(jù)進(jìn)行任何更改,該去哪里。

在處理會(huì)話數(shù)據(jù)時(shí)使用這種基于類的方法在處理大型 Laravel 項(xiàng)目時(shí)為我節(jié)省了無數(shù)次時(shí)間。這是一種簡單的方法,可以產(chǎn)生很大的影響。

在前面的示例中,我已經(jīng)暗示過使用會(huì)話類。但是,讓我們更深入地了解我喜歡如何構(gòu)建這些類。

假設(shè)我們有以下用于新用戶向?qū)У臅?huì)話類。乍一看它可能有點(diǎn)讓人不知所措,但讓我們看看代碼,然后分解它:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

在上面的 AppSessionsUsersWizardSession 類中,我們首先定義了接受 IlluminateContractsSessionSession 實(shí)例的構(gòu)造函數(shù)。通過這樣做,當(dāng)我們從服務(wù)容器中解析 AppSessionsUsersWizardSession 類時(shí),Laravel 將自動(dòng)為我們注入會(huì)話實(shí)例。我將稍后向您展示如何在控制器中執(zhí)行此操作。

然后,我們定義了 5 個(gè)基本的公共方法:

  • getCurrentStep - 返回向?qū)е械漠?dāng)前步驟。如果沒有設(shè)置步驟,則默認(rèn)為 1。
  • setCurrentStep - 設(shè)置向?qū)е械漠?dāng)前步驟。
  • setFormDataForStep - 設(shè)置向?qū)е薪o定步驟的表單數(shù)據(jù)。此方法采用步驟號和 AppDataTransferObjectsWizardsUsersFormData 實(shí)例。
  • getFormDataForStep - 獲取向?qū)е薪o定步驟的表單數(shù)據(jù)。此方法采用步驟號并返回 AppDataTransferObjectsWizardsUsersFormData 實(shí)例或如果數(shù)據(jù)不存在則返回 null
  • flush - 從會(huì)話中刪除與向?qū)嚓P(guān)的所有數(shù)據(jù)。如果已完成或取消向?qū)?,您可能希望調(diào)用此方法。

您可能已經(jīng)注意到所有鍵都在方法內(nèi)部生成。我喜歡這樣做是為了減少使用的原始字符串的數(shù)量(并減少錯(cuò)字的機(jī)會(huì))。這也意味著如果我們想添加另一個(gè)訪問特定鍵的方法,我們可以很容易地做到這一點(diǎn)。

使用這些鍵生成方法的額外好處是我們可以輕松地向鍵添加前綴以避免沖突。在此示例中,我們通過使用 sessionKey 方法將所有鍵的前綴設(shè)置為 new_user_wizard:。

現(xiàn)在此類已設(shè)置,讓我們看看我們?nèi)绾卧诳刂破髦信c它交互:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

正如我們看到的,在上面的示例中,我們將 AppSessionsUsersWizardSession 類注入到我們的控制器方法中。Laravel 將自動(dòng)為我們解析會(huì)話實(shí)例。

然后,我們可以像使用任何其他類一樣與它交互。

起初,這可能感覺像過度抽象和需要維護(hù)更多代碼。但是,隨著項(xiàng)目的增長,類型提示、返回類型、鍵生成方法,甚至方法的命名(使您的操作更具描述性)都非常有用。

在 Laravel 中測試會(huì)話


就像代碼庫的任何其他部分一樣,您應(yīng)該確保您擁有會(huì)話數(shù)據(jù)的覆蓋范圍,以確保正在讀取和寫入正確的字段。

使用會(huì)話類的一大好處是您可以輕松地為類中的每個(gè)方法編寫集中的單元樣式測試。

例如,我們可以為 AppSessionsUsersWizardSession 類的 getFormDataForStep 方法編寫一些測試。作為提醒,以下是該方法:

<code>$currentStep = session()->get(key: 'wizard:current_step');</code>

我們可以在這里測試幾個(gè)場景:

  • 為步驟返回 AppDataTransferObjectsWizardsUsersFormData 對象。
  • 如果步驟不存在表單數(shù)據(jù),則返回 null。

我們的測試類可能如下所示:

<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>

在上面的測試類中,我們有兩個(gè)測試涵蓋了我們前面提到的兩種情況。

這些單元樣式測試非常適合確保您的會(huì)話類配置正確以讀取和寫入會(huì)話數(shù)據(jù)。但它們并不一定能讓你相信它們在代碼庫的其余部分被正確使用。例如,您可能正在調(diào)用 getFormDataForStep(1),而您應(yīng)該調(diào)用 getFormDataForStep(2)。

出于這個(gè)原因,您可能還想考慮在您的功能測試(您通常為控制器編寫的測試)中斷言會(huì)話數(shù)據(jù)。

例如,假設(shè)您的控制器中有以下基本方法,它會(huì)轉(zhuǎn)到向?qū)е械南乱徊剑?/p>

<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>

在上面的方法中,我們首先從會(huì)話中讀取當(dāng)前步驟。然后,我們將當(dāng)前步驟的表單數(shù)據(jù)存儲在會(huì)話中。最后,我們遞增當(dāng)前步驟并重定向到向?qū)е械南乱徊健?/p>

我們將假設(shè)我們的 AppHttpRequestsUsersWizardNextStepRequest 類負(fù)責(zé)驗(yàn)證表單數(shù)據(jù),并在我們調(diào)用 toDto 方法時(shí)返回 AppDataTransferObjectsWizardsUsersFormData 實(shí)例。

我們還將假設(shè) nextStep 控制器方法可通過對 /users/wizard/next-step 路由(名為 users.wizard.next-step)的 POST 請求訪問。

我們可能想編寫如下測試以確保表單數(shù)據(jù)被正確存儲在會(huì)話中:

<code>[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]</code>

在上面的測試中,我們正在使用一些表單數(shù)據(jù)向 /users/wizard/next-step 路由發(fā)出 POST 請求。您可能會(huì)注意到我們正在使用 withSession。此方法允許我們設(shè)置會(huì)話數(shù)據(jù),以便我們可以斷言它被正確讀取。

然后,我們斷言用戶被重定向到向?qū)е械南乱徊剑⑶視?huì)話中的當(dāng)前步驟設(shè)置為 3。我們還斷言步驟 2 的表單數(shù)據(jù)被正確存儲在會(huì)話中。

正如我們在測試中看到的,我們還通過兩種方式從會(huì)話中讀?。?/p>

  • 使用 assertSessionHas 方法檢查會(huì)話數(shù)據(jù)是否正確設(shè)置。
  • 使用 session() 輔助函數(shù)直接讀取會(huì)話數(shù)據(jù)。

這兩種方法都是有效的,因此您可以決定更喜歡哪一種。我在上面的測試中使用了這兩種方法來向您展示您有多種選擇。

結(jié)論


希望本文能幫助您很好地理解會(huì)話是什么以及它們?nèi)绾卧?Laravel 中工作。我還希望它們能為您提供一些關(guān)于如何使用基于類的方法與會(huì)話數(shù)據(jù)交互以避免一些常見陷阱的想法。

以上是深入研究拉拉維爾的會(huì)議的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? 如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在于驗(yàn)證文件類型、重命名文件并限制權(quán)限。1.使用finfo_file()檢查真實(shí)MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機(jī)文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限制文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(松散比較)和===(嚴(yán)格的比較)之間有什么區(qū)別? PHP中==(松散比較)和===(嚴(yán)格的比較)之間有什么區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在于類型檢查的嚴(yán)格程度。==在比較前會(huì)進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會(huì)返回true,例如5==="5"返回false。使用場景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時(shí)使用。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學(xué)運(yùn)算的方法如下:1.加法用 號,支持整數(shù)和浮點(diǎn)數(shù),也可用于變量,字符串?dāng)?shù)字會(huì)自動(dòng)轉(zhuǎn)換但不推薦依賴;2.減法用-號,變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號,適用于數(shù)字及類似字符串;4.除法用/號,需避免除以零,并注意結(jié)果可能是浮點(diǎn)數(shù);5.取模用%號,可用于判斷奇偶數(shù),處理負(fù)數(shù)時(shí)余數(shù)符號與被除數(shù)一致。正確使用這些運(yùn)算符的關(guān)鍵在于確保數(shù)據(jù)類型清晰并處理好邊界情況。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴(kuò)展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(dòng)(通過PECL或Composer安裝)創(chuàng)建客戶端實(shí)例并操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用于高性能場景,Predis則便于快速部署;兩者均適用于生產(chǎn)環(huán)境且文檔完善。

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什么是PHP,為什么它用于Web開發(fā)? 什么是PHP,為什么它用于Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles