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

目錄
關(guān)鍵要點
安裝
創(chuàng)建數(shù)據(jù)庫
創(chuàng)建Transformer
創(chuàng)建控制器
分頁
包含子資源
急切加載
結(jié)論
PHP Fractal常見問題解答
什么是PHP Fractal,為什么它很重要?
PHP Fractal是如何工作的?
PHP Fractal中的Transformer是什么?
PHP Fractal中的Serializer是什么?
我如何在項目中實現(xiàn)PHP Fractal?
我可以將PHP Fractal與任何PHP項目一起使用嗎?
使用PHP Fractal的好處是什么?
PHP Fractal與其他數(shù)據(jù)轉(zhuǎn)換工具相比如何?
我可以自定義PHP Fractal的輸出嗎?
我在哪里可以了解更多關(guān)于PHP Fractal的信息?
首頁 后端開發(fā) php教程 PHP Fractal-使您的API json變得漂亮,永遠!

PHP Fractal-使您的API json變得漂亮,永遠!

Feb 10, 2025 am 09:01 AM

PHP Fractal - Make Your API's JSON Pretty, Always!

本文經(jīng)Viraj Khatavkar同行評審。感謝所有SitePoint的同行評審員,使SitePoint的內(nèi)容達到最佳狀態(tài)!


如果您之前構(gòu)建過API,我敢打賭您習(xí)慣于直接將數(shù)據(jù)作為響應(yīng)輸出。如果操作正確,這可能不會造成危害,但有一些實際的替代方案可以幫助解決這個問題。

其中一個可用的解決方案是Fractal。它允許我們在將模型作為響應(yīng)返回之前,為模型創(chuàng)建一個新的轉(zhuǎn)換層。它非常靈活,易于集成到任何應(yīng)用程序或框架中。

PHP Fractal - Make Your API's JSON Pretty, Always!

關(guān)鍵要點

  • PHP Fractal是一種解決方案,允許開發(fā)人員在將模型作為響應(yīng)返回之前為其模型創(chuàng)建新的轉(zhuǎn)換層,從而使JSON數(shù)據(jù)更易于管理和保持一致性。
  • Fractal靈活且易于集成到任何應(yīng)用程序或框架中。它的工作原理是使用Transformer將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為更簡單的格式,并使用Serializer來格式化最終輸出。
  • Fractal還允許在用戶請求時包含子資源(關(guān)系)到響應(yīng)中,從而為數(shù)據(jù)呈現(xiàn)增加了另一層靈活性和控制。
  • 使用Fractal可以通過一次性急切加載關(guān)系來優(yōu)化查詢性能,從而解決了Eloquent延遲加載經(jīng)常遇到的n 1問題。

安裝

我們將使用Laravel 5.3應(yīng)用程序來構(gòu)建示例并將Fractal包與其集成,因此請繼續(xù)使用安裝程序或通過Composer創(chuàng)建一個新的Laravel應(yīng)用程序。

<code>laravel new demo</code>

<code>composer create-project laravel/laravel demo</code>

然后,在文件夾內(nèi),我們需要Fractal包。

<code>composer require league/fractal</code>

創(chuàng)建數(shù)據(jù)庫

我們的數(shù)據(jù)庫包含users和roles表。每個用戶都有一個角色,每個角色都有一個權(quán)限列表。

// app/User.php

class User extends Authenticatable
{
    protected $fillable = [
        'name',
        'email',
        'password',
        'role_id',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function role()
    {
        return $this->belongsTo(Role::class);
    }
}
// app/Role.php

class Role extends Model
{
    protected $fillable = [
        'name',
        'slug',
        'permissions'
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function users()
    {
        return $this->hasMany(User::class);
    }
}

創(chuàng)建Transformer

我們將為每個模型創(chuàng)建一個Transformer。我們的UserTransformer類如下所示:

// app/Transformers/UserTransformer.php

namespace App\Transformers;

use App\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract
{
    public function transform(User $user)
    {
        return [
            'name' => $user->name,
            'email' => $user->email
        ];
    }
}

是的,創(chuàng)建Transformer就這么簡單!它只是以開發(fā)人員可以管理的方式轉(zhuǎn)換數(shù)據(jù),而不是留給ORM或存儲庫。

我們擴展TransformerAbstract類并定義transform方法,該方法將使用User實例調(diào)用。RoleTransformer類也是如此。

namespace App\Transformers;

use App\Role;
use League\Fractal\TransformerAbstract;

class RoleTransformer extends TransformerAbstract
{
    public function transform(Role $role)
    {
        return [
            'name' => $role->name,
            'slug' => $role->slug,
            'permissions' => $role->permissions
        ];
    }
}

創(chuàng)建控制器

我們的控制器應(yīng)該在將數(shù)據(jù)發(fā)送回用戶之前轉(zhuǎn)換數(shù)據(jù)。我們現(xiàn)在將處理UsersController類,暫時只定義index和show操作。

// app/Http/Controllers/UsersController.php

class UsersController extends Controller
{
    /**
     * @var Manager
     */
    private $fractal;

    /**
     * @var UserTransformer
     */
    private $userTransformer;

    function __construct(Manager $fractal, UserTransformer $userTransformer)
    {
        $this->fractal = $fractal;
        $this->userTransformer = $userTransformer;
    }

    public function index(Request $request)
    {
        $users = User::all(); // 從數(shù)據(jù)庫獲取用戶
        $users = new Collection($users, $this->userTransformer); // 創(chuàng)建資源集合轉(zhuǎn)換器
        $users = $this->fractal->createData($users); // 轉(zhuǎn)換數(shù)據(jù)

        return $users->toArray(); // 獲取轉(zhuǎn)換后的數(shù)據(jù)數(shù)組
    }
}

index操作將從數(shù)據(jù)庫查詢所有用戶,使用用戶列表和轉(zhuǎn)換器創(chuàng)建一個資源集合,然后執(zhí)行實際的轉(zhuǎn)換過程。

{
  "data": [
    {
      "name": "Nyasia Keeling",
      "email": "crooks.maurice@example.net"
    },
    {
      "name": "Laron Olson",
      "email": "helen55@example.com"
    },
    {
      "name": "Prof. Fanny Dach III",
      "email": "edgardo13@example.net"
    },
    {
      "name": "Athena Olson Sr.",
      "email": "halvorson.jules@example.com"
    }
    // ...
  ]
}

當(dāng)然,一次返回所有用戶是沒有意義的,我們應(yīng)該為此實現(xiàn)分頁器。

分頁

Laravel傾向于簡化事情。我們可以像這樣實現(xiàn)分頁:

<code>laravel new demo</code>

但是為了使這與Fractal一起工作,我們可能需要添加一些代碼來轉(zhuǎn)換數(shù)據(jù),然后再調(diào)用分頁器。

<code>composer create-project laravel/laravel demo</code>

第一步是從模型分頁數(shù)據(jù)。接下來,我們像以前一樣創(chuàng)建一個資源集合,然后在集合上設(shè)置分頁器。

Fractal為Laravel提供了一個分頁器適配器來轉(zhuǎn)換LengthAwarePaginator類,它還為Symfony和Zend提供了一個適配器。

<code>composer require league/fractal</code>

請注意,它為分頁詳細信息添加了額外的字段。您可以在文檔中閱讀更多關(guān)于分頁的信息。

包含子資源

現(xiàn)在我們已經(jīng)熟悉了Fractal,是時候?qū)W習(xí)如何在用戶請求時包含子資源(關(guān)系)到響應(yīng)中了。

我們可以請求包含額外資源到響應(yīng)中,例如http://demo.vaprobash.dev/users?include=role。我們的轉(zhuǎn)換器可以自動檢測正在請求的內(nèi)容并解析include參數(shù)。

// app/User.php

class User extends Authenticatable
{
    protected $fillable = [
        'name',
        'email',
        'password',
        'role_id',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function role()
    {
        return $this->belongsTo(Role::class);
    }
}

$availableIncludes屬性告訴轉(zhuǎn)換器我們可能需要包含一些額外的數(shù)據(jù)到響應(yīng)中。如果include查詢參數(shù)請求用戶角色,它將調(diào)用includeRole方法。

// app/Role.php

class Role extends Model
{
    protected $fillable = [
        'name',
        'slug',
        'permissions'
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function users()
    {
        return $this->hasMany(User::class);
    }
}

$this->fractal->parseIncludes行負責(zé)解析include查詢參數(shù)。如果我們請求用戶列表,我們應(yīng)該看到類似這樣的內(nèi)容:

// app/Transformers/UserTransformer.php

namespace App\Transformers;

use App\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract
{
    public function transform(User $user)
    {
        return [
            'name' => $user->name,
            'email' => $user->email
        ];
    }
}

如果每個用戶都有一個角色列表,我們可以將轉(zhuǎn)換器更改為如下所示:

namespace App\Transformers;

use App\Role;
use League\Fractal\TransformerAbstract;

class RoleTransformer extends TransformerAbstract
{
    public function transform(Role $role)
    {
        return [
            'name' => $role->name,
            'slug' => $role->slug,
            'permissions' => $role->permissions
        ];
    }
}

包含子資源時,我們可以使用點表示法嵌套關(guān)系。假設(shè)每個角色都有一個存儲在單獨表中的權(quán)限列表,并且我們想列出具有其角色和權(quán)限的用戶。我們可以這樣做include=role.permissions。

有時,我們需要默認包含一些必要的關(guān)聯(lián),例如地址關(guān)聯(lián)。我們可以通過在轉(zhuǎn)換器中使用$defaultIncludes屬性來實現(xiàn)。

// app/Http/Controllers/UsersController.php

class UsersController extends Controller
{
    /**
     * @var Manager
     */
    private $fractal;

    /**
     * @var UserTransformer
     */
    private $userTransformer;

    function __construct(Manager $fractal, UserTransformer $userTransformer)
    {
        $this->fractal = $fractal;
        $this->userTransformer = $userTransformer;
    }

    public function index(Request $request)
    {
        $users = User::all(); // 從數(shù)據(jù)庫獲取用戶
        $users = new Collection($users, $this->userTransformer); // 創(chuàng)建資源集合轉(zhuǎn)換器
        $users = $this->fractal->createData($users); // 轉(zhuǎn)換數(shù)據(jù)

        return $users->toArray(); // 獲取轉(zhuǎn)換后的數(shù)據(jù)數(shù)組
    }
}

我最喜歡Fractal包的一件事是能夠?qū)?shù)傳遞給include參數(shù)。文檔中的一個很好的例子是按順序排列。我們可以將其應(yīng)用到我們的示例中,如下所示:

{
  "data": [
    {
      "name": "Nyasia Keeling",
      "email": "crooks.maurice@example.net"
    },
    {
      "name": "Laron Olson",
      "email": "helen55@example.com"
    },
    {
      "name": "Prof. Fanny Dach III",
      "email": "edgardo13@example.net"
    },
    {
      "name": "Athena Olson Sr.",
      "email": "halvorson.jules@example.com"
    }
    // ...
  ]
}

這里重要的部分是list($orderCol, $orderBy) = $paramBag->get('order') ?: ['created_at', 'desc'];,這將嘗試從用戶include獲取order參數(shù),并將其應(yīng)用于查詢構(gòu)建器。

我們現(xiàn)在可以通過傳遞參數(shù)來按順序排列包含的用戶列表(/roles?include=users:order(name|asc))。您可以在文檔中閱讀更多關(guān)于包含資源的信息。

但是,如果用戶沒有任何關(guān)聯(lián)的角色會怎樣?它將停止并出現(xiàn)錯誤,因為它期望的是有效數(shù)據(jù)而不是null。讓我們從響應(yīng)中刪除該關(guān)系,而不是顯示其null值。

<code>laravel new demo</code>

急切加載

因為Eloquent在訪問模型時會延遲加載模型,所以我們可能會遇到n 1問題。這可以通過一次性急切加載關(guān)系來解決,以優(yōu)化查詢。

<code>composer create-project laravel/laravel demo</code>

這樣,在訪問模型關(guān)系時,我們將不會有任何額外的查詢。

結(jié)論

我在閱讀Phil Sturgeon撰寫的《構(gòu)建你不會討厭的API》時偶然發(fā)現(xiàn)了Fractal,這是一本很棒且內(nèi)容豐富的讀物,我強烈推薦。

您在構(gòu)建API時是否使用過轉(zhuǎn)換器?您是否有任何首選的執(zhí)行相同工作的包,或者您只是使用json_encode?請在下面的評論部分告訴我們!

PHP Fractal常見問題解答

什么是PHP Fractal,為什么它很重要?

PHP Fractal是一個強大的工具,有助于為API呈現(xiàn)和轉(zhuǎn)換數(shù)據(jù)。它很重要,因為它提供了一種標準化的方法來輸出復(fù)雜、嵌套的數(shù)據(jù)結(jié)構(gòu),確保API的數(shù)據(jù)輸出一致、結(jié)構(gòu)良好且易于理解。這使得開發(fā)人員更容易使用您的API,并減少了出錯的可能性。

PHP Fractal是如何工作的?

PHP Fractal的工作原理是獲取復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并將其轉(zhuǎn)換為更易于使用的格式。它通過兩個主要組件來實現(xiàn):Transformer和Serializer。Transformer負責(zé)將復(fù)雜的數(shù)據(jù)轉(zhuǎn)換為更簡單的格式,而Serializer則格式化最終輸出。

PHP Fractal中的Transformer是什么?

PHP Fractal中的Transformer是定義應(yīng)用程序數(shù)據(jù)應(yīng)如何在API響應(yīng)中輸出的類。它們獲取復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并將它們轉(zhuǎn)換為更簡單、更易于使用的格式。這允許您精確控制API響應(yīng)中包含哪些數(shù)據(jù)以及數(shù)據(jù)的結(jié)構(gòu)。

PHP Fractal中的Serializer是什么?

PHP Fractal中的Serializer負責(zé)格式化API的最終輸出。它們獲取已由Transformer轉(zhuǎn)換的數(shù)據(jù),并將其格式化為特定的結(jié)構(gòu)。這允許您確保API的輸出一致且易于理解。

我如何在項目中實現(xiàn)PHP Fractal?

在項目中實現(xiàn)PHP Fractal包括通過Composer安裝Fractal庫,為數(shù)據(jù)創(chuàng)建Transformer,然后使用Fractal類使用Transformer轉(zhuǎn)換數(shù)據(jù)。然后,您可以使用Fractal的Serializer之一輸出轉(zhuǎn)換后的數(shù)據(jù)。

我可以將PHP Fractal與任何PHP項目一起使用嗎?

是的,PHP Fractal是一個獨立的庫,可以與任何PHP項目一起使用。它不依賴于任何特定的框架或平臺,這使得它成為任何PHP開發(fā)人員的通用工具。

使用PHP Fractal的好處是什么?

使用PHP Fractal提供了許多好處。它確保API的輸出一致且結(jié)構(gòu)良好,使開發(fā)人員更容易使用。它還提供了一種標準化的方法來轉(zhuǎn)換復(fù)雜的數(shù)據(jù)結(jié)構(gòu),減少了出錯的可能性,并使代碼更容易維護。

PHP Fractal與其他數(shù)據(jù)轉(zhuǎn)換工具相比如何?

PHP Fractal以其簡單性和靈活性而脫穎而出。它提供了一種直接的方法來轉(zhuǎn)換復(fù)雜的數(shù)據(jù)結(jié)構(gòu),并且它使用Transformer和Serializer允許高度定制。這使得它成為任何使用API的開發(fā)人員的強大工具。

我可以自定義PHP Fractal的輸出嗎?

是的,PHP Fractal是高度可定制的。您可以創(chuàng)建自定義Transformer來精確控制數(shù)據(jù)的轉(zhuǎn)換方式,并且您可以使用不同的Serializer以不同的方式格式化輸出。這允許您根據(jù)您的特定需求調(diào)整API的輸出。

我在哪里可以了解更多關(guān)于PHP Fractal的信息?

有很多資源可以幫助您了解更多關(guān)于PHP Fractal的信息。官方PHP League網(wǎng)站提供了全面的文檔,并且網(wǎng)上有許多教程和博文。此外,PHP Fractal GitHub存儲庫是一個探索代碼并查看其使用方法示例的好地方。

以上是PHP Fractal-使您的API json變得漂亮,永遠!的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(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

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

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

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

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

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

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

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

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

我如何了解最新的PHP開發(fā)和最佳實踐? 我如何了解最新的PHP開發(fā)和最佳實踐? 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時區(qū)? 如何設(shè)置PHP時區(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