首頁  >  文章  >  後端開發  >  Laravel中的優雅訪問器和修改器

Laravel中的優雅訪問器和修改器

WBOY
WBOY原創
2023-08-29 22:53:101082瀏覽

Laravel中的優雅訪問器和修改器

在本文中,我們將介紹 Laravel Web 框架中 Eloquent ORM 的修改器和存取器。介紹完畢後,我們將透過一些範例來理解這些概念。

在 Laravel 中,修改器和存取器可讓您在將資料儲存到資料庫或從資料庫中取得資料之前變更資料。具體來說,變異器允許您在將資料儲存到資料庫之前更改資料。另一方面,存取器允許您在從資料庫獲取資料後更改資料。

事實上,Laravel 模型是您可以建立修改器和存取器方法的中心位置。當然,將所有修改放在一個地方而不是分散在不同的地方是件好事。

在模型類別中建立存取器和修改器

既然您現在已經熟悉了修改器和存取器的基本概念,我們將繼續開發一個實際範例來示範它。

我假設您了解 Laravel 中的 Eloquent 模型,我們將使用 Post 模型作為範例的起點。如果您還沒有建立 Post 模型,讓我們使用 artisan 指令來建立它。

php artisan make:model Post --migration

這應該在 app/Post.php 中建立一個模型文件,如下所示。

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Post extends Model
{
    //
}

讓我們用以下內容取代該文件的內容。

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;

class Post extends Model
{
    /**
     * Interact with the user's name attribute.
     *
     * @param  string  $value
     * @return \Illuminate\Database\Eloquent\Casts\Attribute
     */
    protected function name(): Attribute
    {
        return Attribute::make(
            get: fn ($value) => ucfirst($value),
            set: fn ($value) => strtolower($value),
        );
    }
}

由於我們使用了 --migration 選項,它還應該建立關聯的資料庫遷移。以防萬一您不知道,您可以執行以下命令,以便它實際在資料庫中建立表格。

php artisan migrate

為了執行本文中的範例,您需要在 post 表中建立 name 欄位。無論如何,我們不會詳細討論遷移的細節,因為這超出了本文的範圍。

Mutator 方法

首先,我們來看看 mutator 方法。

protected function name(): Attribute
{
    return Attribute::make(
        #get: fn ($value) => ucfirst($value),
        set: fn ($value) => strtolower($value),
    );
}

正如我們之前討論的,修改器用於在將資料保存到資料庫之前更改資料。如您所見,mutator 方法的語法為 {attribute-name}。當然,您需要將 {attribute-name} 替換為駝峰大小寫的實際屬性名稱。需要注意的是,所有存取器和修改器方法都會傳回一個 Attribute 實例,該實例定義如何存取和修改屬性。

在屬性上呼叫 mutator 方法時,將使用 set 參數。為了簡單起見,我們只使用了 strtolower 函數,該函數在將帖子標題保存到資料庫之前將其轉換為小寫。

透過這種方式,您可以在表格的所有欄位上建立變異方法。接下來,我們來看看訪問器方法。

存取器方法

如果在將資料儲存到資料庫之前使用變元來變更數據,則存取器方法用於在從資料庫取得資料後變更資料。要定義存取器方法,您需要在定義屬性時提供 get 參數。

讓我們來看看訪問器方法。

protected function name(): Attribute
{
    return Attribute::make(
        get: fn ($value) => ucfirst($value),
        #set: fn ($value) => strtolower($value),
    );
}

從資料庫取得 name 屬性的值後,將呼叫 get 參數。在我們的例子中,我們剛剛使用 ucfirst 方法來更改貼文標題。

到目前為止,我們剛剛創建了賦值器和存取器方法,但我們將在接下來的部分中測試它們。

變異器的作用

讓我們在 app/Http/Controllers/MutatorController.php 建立一個控制器,以便我們可以測試我們在前面部分中建立的 mutator 方法。

<?php
// app/Http/Controllers/MutatorController.php
namespace App\Http\Controllers;
 
use App\Post;
use App\Http\Controllers\Controller;
 
class MutatorController extends Controller
{
    public function index()
    {
        // create a new post object
        $post = new Post;
        $post->name = 'Post Title';
        $post->save();
    }
}

此外,您還需要在 routes/web.php 檔案中建立關聯的路由才能存取 mutator 控制器。

Route::get('mutator/index', 'MutatorController@index');

index 方法中,我們使用 Post 模型建立一個新貼文。它應該將 name 列的值設為 post title 值,因為我們在對應的 mutator 方法中使用了 strtolower 函數。

操作中的存取器

要查看操作中的存取器,讓我們繼續建立一個包含以下內容的控制器檔案 app/Http/Controllers/AccessorController.php

<?php
namespace App\Http\Controllers;
 
use App\Post;
use App\Http\Controllers\Controller;
 
class AccessorController extends Controller
{
    public function index()
    {
        // load post
        $post = Post::find(1);
         
        // check the name property, it should be output of the ucfirst function
        echo $post->name;
        exit;
    }
}

同樣,您需要在 routes/web.php 檔案中使用關聯的路由來存取存取器控制器。

Route::get('accessor/index', 'AccessorController@index');

index 方法中,我們首先使用 Post 模型來載入範例貼文。

接下來,我們檢查 name 列的值,它應該以大寫字母開頭,因為我們已經為該列定義了存取器方法。

這就是 Eloquent 變異器和存取器的工作原理!

結論

今天,我們探討了 Laravel 中 Eloquent ORM 的修改器和存取器的概念。它提供了一種在將資料保存到資料庫和從資料庫中提取資料之前更改資料的好方法。

對於那些剛開始使用 Laravel 或希望透過擴充功能來擴展您的知識、網站或應用程式的人,我們在 Envato Market 上提供了多種可供您學習的內容。

以上是Laravel中的優雅訪問器和修改器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn