Artikel ini telah dikaji semula oleh Viraj Khatavkar. Terima kasih kepada semua pengulas rakan sebaya SitePoint untuk mendapatkan kandungan SitePoint untuk yang terbaik!
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.
mata utama
atau
<code>laravel new demo</code>
Kemudian, dalam folder, kita memerlukan pakej fraktal.
<code>composer create-project laravel/laravel demo</code>
Buat pangkalan data
<code>composer require league/fractal</code>
// 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); } }
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 ]; } }
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 ]; } }
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(); // 获取转换后的数据数组 } }
Sudah tentu, tidak masuk akal untuk mengembalikan semua pengguna sekaligus, dan kita harus melaksanakan pager untuk ini.
Laravel cenderung untuk memudahkan perkara. Kita boleh melaksanakan penomboran seperti ini:
<code>laravel new demo</code>
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>
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>
Perhatikan bahawa ia menambah medan tambahan ke butiran paging. Anda boleh membaca lebih lanjut mengenai paging dalam dokumentasi.
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); } }
$ 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); } }
$ 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 ]; } }
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 ]; } }
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(); // 获取转换后的数据数组 } }
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" } // ... ] }
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>
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>
Dengan cara ini, kami tidak akan mempunyai pertanyaan tambahan apabila mengakses hubungan model.
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 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.
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.
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.
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.
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.
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.
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.
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.
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.
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!