Laravel 类型
目录
特征
- 从 Laravel 模型生成类型
- 支持关系表
- 支持 Enum( 来自 PHP8.1)
- 从 Laravel 表格请求生成类型
- 生成 siggy (Routing) 的类型
- 为 Laravel 提供有用的类型( 如 pagination等)
支持的版本
该库支持以下版本:
- Laravel 9.x和10.x (英语)
- 脚本 5.0 及以上类型
安装
$ npm install -D @7nohe/laravel-typegen
Laravel Typegen可能需要安装 doctrine/dbal 通过作曲器执行 php artisan model:show 内部命令.
$ composer require doctrine/dbal
使用量
编辑软件包.json
{
"scripts": {
"typegen": "laravel-typegen"
},
}
$ npm run typegen
Enum 支持
我们也支持php8.1 enums.
<!-- app/Enums/GenderType.php -->
<?php
namespace App\Enums;
enum GenderType: string
{
case Male = 'Male';
case Female = 'Female';
case Other = 'Other';
}
然后,将模型属性投入enums.
<!-- app/Models/User.php -->
<?php
namespace App\Models;
use App\Enums\GenderType;
class User extends Authenticatable
{
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'gender' => GenderType::class,
];
}
此库将生成以下类型 :
export type User = {
id: number;
name: string;
email: string;
gender: GenderType;
email_verified_at?: string;
created_at?: string;
updated_at?: string;
posts?: Post[];
};
export enum GenderType {
Male = "Male",
Female = "Female",
Other = "Other"
}
Laravel Enum 支持
如果您使用 拉维尔·埃纳姆选项 --laravel-enum。 。 。 .
{
"scripts": {
"typegen": "laravel-typegen --laravel-enum"
},
}
使用强键 route() ziggy 函数
运行 laravel-typegen 命令与 --ziggy 选项将生成路由.d.ts.
帮助输入 route() 函数.
{
"scripts": {
"typegen": "laravel-typegen --ziggy"
},
}
例如,定义下列路线
// routes/web.php
Route::resource('posts', PostsController::class);
$ php artisan route:list
GET|HEAD posts/{post} posts.show › PostsController@show
参数将严格根据路由名称进行核对.
// in your TypeScript code
// OK
route('posts.show', { post: post.id })
// Error
route('posts.show', { id: post.id })
如果您创建了使用 --typescript laravel Breeze 的选项,您需要删除此选项的声明 route() 在资源/js/类型/global.d.ts中运行.
import { PageProps as InertiaPageProps } from '@inertiajs/core';
import { AxiosInstance } from 'axios';
import ziggyRoute, { Config as ZiggyConfig } from 'ziggy-js';
import { PageProps as AppPageProps } from './';
declare global {
interface Window {
axios: AxiosInstance;
}
var route: typeof ziggyRoute;
var Ziggy: ZiggyConfig;
}
- declare module 'vue' {
- interface ComponentCustomProperties {
- route: typeof ziggyRoute;
- }
- }
declare module '@inertiajs/core' {
interface PageProps extends InertiaPageProps, AppPageProps {}
}
Laravel 有用类型
我们为Laravel(特别是Inertia)提供了有用的类型.
例如,要返回 Dashboard Captain 中的 Pagized Inertia 响应, 您可以写到以下
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Inertia\Inertia;
class DashboardController extends Controller
{
public function __invoke()
{
$users = User::latest('id')->paginate(5);
return Inertia::render(
'Dashboard',
[
'users' => $users
]
);
}
}
您可以导入 Laravel Typegen 已经定义的类型 .
<!-- Dashboard.vue -->
<script setup lang="ts">
import { Paginate } from '@7nohe/laravel-typegen';
import { User } from '@/types/model'; // generated types
defineProps<{ users: Paginate<User> }>();
</script>
<template>
<div>
<ul>
<li v-for="user in users.data">- {{ user.name }}({{ user.email }})</li>
</ul>
<div class="flex justify-center mt-4 space-x-4">
<Link v-for="(link, key) in users.links" :key="key" :href="link.url ?? '#'" v-html="link.label" />
</div>
</div>
</template>
申请类型
您可以通过执行命令从 Laravel 格式请求中生成类型 --form-requests 选项.
申请表格的类别如下:
<?php
namespace App\Http\Requests;
use App\Models\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class ProfileUpdateRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'name' => ['string', 'max:255'],
'email' => ['email', 'max:255', Rule::unique(User::class)->ignore($this->user()->id)],
];
}
}
相应的TypeScript类型将自动生成如下:
// formRequests.ts
export type ProfileUpdateRequest = {
name?: string;
email?: string;
};
通过与Axios等HTTP客户端库结合使用这些生成的类型,可以写出更多的类型安全代码.
可用选项
Usage: laravel-typegen [options]
Generate TypeScript types from your Laravel code
Options:
-V, --version output the version number
-o, --output <value> Output directory (default: "resources/js/types")
--laravel-enum Use Laravel Enum (default: false)
--enum-path <value> Path to enum files (default: "app/Enums")
--model-path <value> Path to model files (default: "app/Models")
-z, --ziggy Generate types for ziggy (default: false)
--vendor-routes Include routes defined by vendor packages (default: false)
--ignore-route-dts Ignore generating route.d.ts (default: false)
--form-request Generate types for FormRequests (default: false)
--form-request-path <value> Path to FormRequest files (default: "app/Http/Requests")
-h, --help display help for command
发展
设置示例项目
$ cd examples/laravel10-app
$ cp .env.example .env
$ docker run --rm \
-u "$(id -u):$(id -g)" \
-v "$(pwd):/var/www/html" \
-w /var/www/html \
laravelsail/php81-composer:latest \
composer install --ignore-platform-reqs
$ ./vendor/bin/sail up -d
$ ./vendor/bin/sail php artisan key:generate
$ ./vendor/bin/sail php artisan migrate --seed
$ ./vendor/bin/sail npm install
调试
$ pnpm install
$ sh debug.sh
许可证
麻省理工学院