Rumah > pembangunan bahagian belakang > tutorial php > PHP Fractal - Buat JSON API '

PHP Fractal - Buat JSON API '

Lisa Kudrow
Lepaskan: 2025-02-10 09:01:09
asal
390 orang telah melayarinya

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

Artikel ini telah dikaji semula oleh Viraj Khatavkar. Terima kasih kepada semua pengulas rakan sebaya SitePoint untuk mendapatkan kandungan SitePoint untuk yang terbaik!


Jika anda telah membina API sebelum ini, saya yakin anda digunakan untuk mengeluarkan data secara langsung sebagai respons. Ini mungkin tidak berbahaya jika ia dilakukan dengan betul, tetapi terdapat beberapa alternatif praktikal yang dapat membantu menyelesaikan masalah ini.

Salah satu penyelesaian yang ada ialah fraktal. Ia membolehkan kita membuat lapisan transformasi baru untuk model sebelum mengembalikan model sebagai tindak balas. Ia sangat fleksibel dan mudah diintegrasikan ke dalam sebarang aplikasi atau rangka kerja.

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

php fractal adalah penyelesaian yang membolehkan pemaju membuat lapisan transformasi baru untuk model mereka sebelum mengembalikannya sebagai respons, menjadikan data JSON lebih mudah untuk dikendalikan dan konsisten.
  • Fractal adalah fleksibel dan mudah diintegrasikan ke dalam sebarang aplikasi atau rangka kerja. Ia berfungsi dengan menggunakan Transformer untuk menukar struktur data kompleks ke dalam format yang lebih mudah dan menggunakan serializer untuk memformat output akhir.
  • Fractal juga membolehkan kemasukan sub-sumber (hubungan) ke dalam respons apabila diminta oleh pengguna, menambah satu lagi lapisan fleksibiliti dan kawalan kepada rendering data.
  • Menggunakan Fractal boleh mengoptimumkan prestasi pertanyaan dengan memuatkan hubungan pada satu masa, dengan itu menyelesaikan masalah n 1 yang memunggah malas yang fasih sering bertemu.
  • Pemasangan

kami akan menggunakan aplikasi Laravel 5.3 untuk membina contoh dan mengintegrasikan pakej fraktal dengannya, jadi teruskan dan gunakan pemasang atau buat aplikasi Laravel baru melalui komposer.

atau
<code>laravel new demo</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kemudian, dalam folder, kita memerlukan pakej fraktal.
<code>composer create-project laravel/laravel demo</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Buat pangkalan data
<code>composer require league/fractal</code>
Salin selepas log masuk
Salin selepas log masuk

pangkalan data kami mengandungi pengguna dan jadual peranan. Setiap pengguna mempunyai peranan dan setiap peranan mempunyai senarai kebenaran.

// 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);
    }
}
Salin selepas log masuk
Salin selepas log masuk
Buat Transformer
// 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);
    }
}
Salin selepas log masuk
Salin selepas log masuk

kami akan membuat pengubah untuk setiap model. Kelas UserTransformer kami kelihatan seperti ini:

Ya, mencipta pengubah adalah mudah! Ia hanya menukarkan data dengan cara yang dapat dikendalikan oleh pemaju, tidak meninggalkannya ke ORM atau repositori.
// 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
        ];
    }
}
Salin selepas log masuk
Salin selepas log masuk

kami melanjutkan kelas TransformerAbstract dan menentukan kaedah transformasi, yang akan dipanggil menggunakan contoh pengguna. Begitu juga dengan kelas Roletransformer.

Buat pengawal
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
        ];
    }
}
Salin selepas log masuk
Salin selepas log masuk

Pengawal kami harus menukar data sebelum menghantarnya kembali kepada pengguna. Kami kini akan mengendalikan kelas UserScontroller, dan sementara menentukan hanya indeks dan menunjukkan operasi.

Operasi indeks akan menanyakan semua pengguna dari pangkalan data, membuat koleksi sumber menggunakan senarai pengguna dan penukar, dan kemudian melakukan proses penukaran sebenar.

// 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(); // 从数据库获取用户
        $users = new Collection($users, $this->userTransformer); // 创建资源集合转换器
        $users = $this->fractal->createData($users); // 转换数据

        return $users->toArray(); // 获取转换后的数据数组
    }
}
Salin selepas log masuk
Salin selepas log masuk

Sudah tentu, tidak masuk akal untuk mengembalikan semua pengguna sekaligus, dan kita harus melaksanakan pager untuk ini.

Pagination

Laravel cenderung untuk memudahkan perkara. Kita boleh melaksanakan penomboran seperti ini:

<code>laravel new demo</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Tetapi agar ini berfungsi dengan Fractal, kita mungkin perlu menambah beberapa kod untuk menukar data dan kemudian panggil pager.

<code>composer create-project laravel/laravel demo</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Langkah pertama adalah untuk menafikan data dari model. Seterusnya, kami membuat koleksi sumber seperti sebelum dan kemudian menyediakan pager pada koleksi.

Fractal menyediakan Laravel dengan penyesuai paginator untuk menukar kelas Longawarepaginator, yang juga menyediakan penyesuai untuk Symfony dan Zend.

<code>composer require league/fractal</code>
Salin selepas log masuk
Salin selepas log masuk

Perhatikan bahawa ia menambah medan tambahan ke butiran paging. Anda boleh membaca lebih lanjut mengenai paging dalam dokumentasi.

Termasuk sub-resources

Sekarang kita sudah biasa dengan Fractal, sudah tiba masanya untuk mengetahui cara memasukkan subresources (hubungan) ke dalam respons apabila permintaan pengguna.

kita boleh meminta untuk memasukkan sumber tambahan ke dalam respons, contohnya http://demo.vaprobash.dev/users?include=role. Penukar kami secara automatik dapat mengesan apa yang diminta dan menghuraikan parameter termasuk.

// 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);
    }
}
Salin selepas log masuk
Salin selepas log masuk
Hartanah

$ yang ada termasuk penukar bahawa kita mungkin perlu memasukkan beberapa data tambahan ke dalam respons. Jika parameter pertanyaan termasuk meminta peranan pengguna, ia akan memanggil kaedah 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);
    }
}
Salin selepas log masuk
Salin selepas log masuk

$ this- & gt; fractal- & gt; ParseIncludes Line bertanggungjawab untuk parsing termasuk parameter pertanyaan. Jika kita meminta senarai pengguna, kita harus melihat sesuatu seperti ini:

// 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
        ];
    }
}
Salin selepas log masuk
Salin selepas log masuk

Jika setiap pengguna mempunyai senarai peranan, kita boleh menukar penukar kepada sesuatu seperti ini:

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
        ];
    }
}
Salin selepas log masuk
Salin selepas log masuk
Apabila

mengandungi subresources, kita boleh menggunakan notasi titik ke sarang . Katakan setiap peranan mempunyai senarai kebenaran yang disimpan dalam jadual berasingan dan kami ingin menyenaraikan pengguna dengan peranan dan keizinan mereka. Kita boleh lakukan termasuk = role.permissions. Kadang -kadang, kita perlu memasukkan beberapa persatuan yang diperlukan secara lalai, seperti persatuan alamat. Kita boleh melakukan ini dengan menggunakan $ defaultincludes harta dalam penukar.

Salah satu perkara kegemaran saya mengenai pakej fraktal adalah keupayaan untuk lulus parameter untuk memasukkan parameter. Contoh yang baik dalam dokumentasi adalah disusun mengikut urutan. Kita boleh memohon kepada contoh kita seperti berikut:
// 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(); // 从数据库获取用户
        $users = new Collection($users, $this->userTransformer); // 创建资源集合转换器
        $users = $this->fractal->createData($users); // 转换数据

        return $users->toArray(); // 获取转换后的数据数组
    }
}
Salin selepas log masuk
Salin selepas log masuk

bahagian penting di sini adalah senarai ($ ordercol, $ orderby) = $ parambag- & gt; get ('order')?: ['Created_at', 'desc'];, yang akan cuba mendapatkan parameter pesanan dari Pengguna termasuk dan memohon kepada pembina pertanyaan.
{
  "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"
    }
    // ...
  ]
}
Salin selepas log masuk

kita kini boleh menyusun senarai pengguna yang disertakan mengikut urutan dengan lulus parameter (/peranan? Termasuk = Pengguna: Pesanan (Nama | ASC)). Anda boleh membaca lebih lanjut mengenai termasuk sumber dalam dokumentasi.

Tetapi apa yang berlaku jika pengguna tidak mempunyai peranan yang berkaitan? Ia akan berhenti dan ralat muncul kerana ia menjangkakan data yang sah dan bukannya batal. Mari kita keluarkan hubungan dari respons dan bukannya memaparkan nilai nolnya.

<code>laravel new demo</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pemuatan Kecemasan

Kerana kelewatan fasih memuatkan model apabila mengaksesnya, kita mungkin menghadapi masalah n 1 . Ini dapat diselesaikan dengan hubungan pemuatan yang bersemangat sekali untuk mengoptimumkan pertanyaan.

<code>composer create-project laravel/laravel demo</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dengan cara ini, kami tidak akan mempunyai pertanyaan tambahan apabila mengakses hubungan model.

Kesimpulan

Saya terjumpa Fractal semasa membaca "Membina API Anda Tidak Akan Benci" oleh Phil Sturgeon, membaca yang hebat dan bermaklumat yang saya sangat mengesyorkan.

Adakah anda menggunakan penukar semasa membina API anda? Adakah anda mempunyai pakej pilihan yang melakukan kerja yang sama, atau adakah anda hanya menggunakan json_encode? Tolong beritahu kami di bahagian komen di bawah!

php fractal faq

Apakah php fractal dan mengapa ia penting?

php fractal adalah alat yang berkuasa yang membantu menjadikan dan mengubah data untuk API. Adalah penting kerana ia menyediakan cara standard untuk mengeluarkan struktur data kompleks, bersarang, memastikan output data API adalah konsisten, berstruktur, dan mudah difahami. Ini memudahkan pemaju menggunakan API anda dan mengurangkan kemungkinan kesilapan.

bagaimana php fractal berfungsi?

php fractal berfungsi dengan mengambil struktur data yang kompleks dan menukarnya menjadi format yang lebih mudah untuk digunakan. Ia dilaksanakan melalui dua komponen utama: Transformer dan Serializer. Transformer bertanggungjawab untuk menukar data kompleks ke dalam format yang lebih mudah, manakala format Serializer output akhir.

Apakah Transformer dalam PHP Fractal?

Transformer dalam php fractal adalah kelas yang mentakrifkan bagaimana data aplikasi harus dikeluarkan dalam tindak balas API. Mereka mengambil struktur data yang kompleks dan mengubahnya menjadi lebih mudah, lebih mudah untuk menggunakan format. Ini membolehkan anda untuk mengawal data apa yang dimasukkan dalam respons API dan bagaimana ia berstruktur.

Apakah Serializer dalam PHP Fractal?

Serializer dalam php fractal bertanggungjawab untuk memformat output akhir API. Mereka mengambil data yang telah ditukar oleh Transformer dan memformatnya ke dalam struktur tertentu. Ini membolehkan anda memastikan bahawa output API adalah konsisten dan mudah difahami.

bagaimana saya melaksanakan php fractal dalam projek saya?

Melaksanakan fraktal PHP dalam projek melibatkan memasang perpustakaan fraktal melalui komposer, mewujudkan pengubah untuk data, dan kemudian menggunakan kelas fraktal untuk mengubah data menggunakan pengubah. Anda kemudiannya boleh menggunakan salah satu serializers Fractal untuk mengeluarkan data yang ditukar.

Bolehkah saya menggunakan fraktal php dengan mana -mana projek php?

Ya, php fractal adalah perpustakaan mandiri yang boleh digunakan dengan mana -mana projek PHP. Ia tidak bergantung pada rangka kerja atau platform tertentu, yang menjadikannya alat sejagat bagi mana -mana pemaju PHP.

Apakah faedah menggunakan fraktal php?

Menggunakan php fractal menyediakan banyak faedah. Ia memastikan bahawa output API adalah konsisten dan berstruktur dengan baik, menjadikannya lebih mudah bagi pemaju untuk digunakan. Ia juga menyediakan cara yang standard untuk mengubah struktur data yang kompleks, mengurangkan kemungkinan kesilapan dan menjadikan kod lebih mudah untuk dikekalkan.

Bagaimana php fractal berbanding dengan alat penukaran data lain?

php fractal menonjol untuk kesederhanaan dan fleksibiliti. Ia menyediakan cara yang mudah untuk mengubah struktur data yang kompleks, dan ia membolehkan penyesuaian yang tinggi menggunakan pengubah dan serializer. Ini menjadikannya alat yang kuat untuk mana -mana pemaju yang menggunakan API.

Bolehkah saya menyesuaikan output fraktal php?

Ya, php fractal sangat disesuaikan. Anda boleh membuat transformer tersuai untuk mengawal secara tepat bagaimana data anda ditukarkan, dan anda boleh memformat output dengan cara yang berbeza menggunakan serializers yang berbeza. Ini membolehkan anda menyesuaikan output API anda kepada keperluan khusus anda.

di mana saya boleh mengetahui lebih lanjut mengenai php fractal?

Terdapat banyak sumber untuk membantu anda mempelajari lebih lanjut mengenai PHP Fractal. Laman web Liga PHP rasmi menyediakan dokumentasi yang komprehensif dan terdapat banyak tutorial dan catatan blog dalam talian. Di samping itu, Repositori GitHub PHP Fractal adalah tempat yang bagus untuk meneroka kod dan melihat contoh bagaimana ia digunakan.

Atas ialah kandungan terperinci PHP Fractal - Buat JSON API '. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan