1. Go to this page and download the library: Download dragosstoenica/laravel-zod library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
dragosstoenica / laravel-zod example snippets
use LaravelZod\Attributes\ZodSchema;
// Output — inferred from PHP property types. No validation rules read.
#[ZodSchema]
class UserData extends \Spatie\LaravelData\Data
{
public function __construct(
public int $id,
public string $name,
public string $email,
) {}
}
#[ZodSchema]
class EventData extends \Spatie\LaravelData\Data
{
public function __construct(
public int $id,
public string $title,
public ?UserData $host, // → host: UserDataSchema.nullable()
/** @var EventAttendeeData[]|null */
public ?array $attendees, // → attendees: z.array(EventAttendeeDataSchema).nullable()
public \Carbon\CarbonImmutable $starts_at, // → starts_at: z.string()
) {}
}
// Input — Laravel rules() drive everything: type, constraints, cross-field, messages.
#[ZodSchema]
class StoreEventRequest extends \Illuminate\Foundation\Http\FormRequest
{
public function rules(): array
{
return [
'title' => ['
return [
'output' => base_path('../packages/shared-types/schemas.ts'),
'scan' => [app_path()],
'locale' => null, // null → app()->getLocale(), then 'en'
'suffix' => 'Schema', // ClassName + suffix → export const
'server_only_rules' => ['exists', 'unique', 'current_password'],
'server_only_behaviour' => 'comment', // 'comment' | 'fail'
'custom_rules_strict' => false, // true → fail when a custom Rule has no toZod()
'header' => [
'// AUTO-GENERATED by dragosstoenica/laravel-zod. Do not edit by hand.',
'// Run `php artisan zod:generate` to refresh.',
],
];
'max' => [
'string' => 'The :attribute field must not be greater than :max characters.',
'numeric' => 'The :attribute field must not be greater than :max.',
'array' => 'The :attribute field must not have more than :max items.',
'file' => 'The :attribute field must not be greater than :max kilobytes.',
],
use LaravelZod\Contracts\HasZodSchema;
use Illuminate\Contracts\Validation\ValidationRule;
class StartsWithPlus implements ValidationRule, HasZodSchema
{
public function validate(string $attribute, mixed $value, \Closure $fail): void
{
if (! str_starts_with($value, '+')) $fail('Must start with +.');
}
public function toZod(): string
{
// Either a chain fragment (starts with `.`) or a full expression.
return ".refine((v) => typeof v === 'string' && v.startsWith('+'), 'Must start with +')";
}
}
// Use it:
'phone' => ['
bash
php artisan zod:generate # writes the configured output path
php artisan zod:generate --dry-run # print to stdout
php artisan zod:generate --locale=ro # use lang/ro/validation.php for defaults