<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use Hypervel\Http\Request;

class IndexController extends AbstractController
{
    public function index(Request $request): array
    {
        $user = $request->input('user', 'Hypervel');
        $method = $request->getMethod();
        return [
            'method' => $method,
            'message' => "Hello {$user}.",
        ];
    }
}

<?php

declare(strict_types=1);

namespace App\Exceptions;

use Hypervel\Foundation\Exceptions\Handler as ExceptionHandler;
use Hypervel\Http\Request;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * The list of the inputs that are never flashed to the session on validation exceptions.
     *
     * @var array<int, string>
     */
    protected array $dontFlash = [
        'current_password',
        'password',
        'password_confirmation',
    ];

    /**
     * Register the exception handling callbacks for the application.
     */
    public function register(): void
    {
        // return json when path start with `api`
        $this->shouldRenderJsonWhen(function (Request $request, Throwable $e) {
            return str_starts_with($path = $request->path(), 'api')
                && (strlen($path) === 3 || $path[3] === '/');
        });

        $this->reportable(function (Throwable $e) {
        });
    }
}

<?php

declare(strict_types=1);

namespace App\Http;

use Hypervel\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array<int, class-string|string>
     */
    protected array $middleware = [
        // \App\Http\Middleware\TrimStrings::class,
        // \App\Http\Middleware\ConvertEmptyStringsToNull::class
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected array $middlewareGroups = [
        'web' => [
            // \Hypervel\Router\Middleware\SubstituteBindings::class,
            // \Hypervel\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            // \Hypervel\Session\Middleware\StartSession::class,
            // \Hypervel\View\Middleware\ShareErrorsFromSession::class,
            // \App\Http\Middleware\VerifyCsrfToken::class,
        ],

        'api' => [
            // 'throttle:60,1,api',
            // \Hypervel\Router\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * The application's middleware aliases.
     *
     * Aliases may be used instead of class names to conveniently assign middleware to routes and groups.
     *
     * @var array<string, class-string|string>
     */
    protected array $middlewareAliases = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'can' => \Hypervel\Auth\Middleware\Authorize::class,
        'throttle' => \Hypervel\Router\Middleware\ThrottleRequests::class,
        'bindings' => \Hypervel\Router\Middleware\SubstituteBindings::class,
        'signed' => \App\Http\Middleware\ValidateSignature::class,
    ];

    /**
     * The priority-sorted list of middleware.
     *
     * Forces non-global middleware to always be in the given order.
     *
     * @var string[]
     */
    protected array $middlewarePriority = [
        // \Hypervel\Router\Middleware\ThrottleRequests::class,
        // \Hypervel\Router\Middleware\SubstituteBindings::class,
        // \Hypervel\Session\Middleware\StartSession::class,
        // \Hypervel\View\Middleware\ShareErrorsFromSession::class,
        // \App\Http\Middleware\VerifyCsrfToken::class,
    ];
}

<?php

declare(strict_types=1);

namespace App\Console\Commands;

use Hypervel\Console\Command;

class DemoCommand extends Command
{
    protected ?string $signature = 'demo:hi {--name=}';

    protected string $description = 'Hyperf Demo Command';

    public function handle()
    {
        $this->info('Hello ' . ($this->option('name') ?: 'Hypervel'));
    }
}

<?php

declare(strict_types=1);

namespace App\Http\Requests;

use Hypervel\Foundation\Http\FormRequest;

class DemoRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     */
    public function rules(): array
    {
        return [
            'name' => 'required|string|min:3',
            'email' => 'required|email',
            'email2' => 'required|array',
        ];
    }
}

<?php

declare(strict_types=1);

namespace App\Listeners;

use Hyperf\Collection\Arr;
use Hyperf\Database\Events\QueryExecuted;
use Hyperf\Event\Contract\ListenerInterface;
use Hyperf\Framework\Logger\StdoutLogger;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;

class DbQueryExecutedListener implements ListenerInterface
{
    private LoggerInterface $logger;

    public function __construct(ContainerInterface $container)
    {
        $this->logger = $container->get(StdoutLogger::class);
    }

    public function listen(): array
    {
        return [
            QueryExecuted::class,
        ];
    }

    /**
     * @param QueryExecuted $event
     */
    public function process(object $event): void
    {
        if ($event instanceof QueryExecuted) {
            $sql = $event->sql;
            if (! Arr::isAssoc($event->bindings)) {
                $position = 0;
                foreach ($event->bindings as $value) {
                    $position = strpos($sql, '?', $position);
                    if ($position === false) {
                        break;
                    }
                    $value = "'{$value}'";
                    $sql = substr_replace($sql, $value, $position, 1);
                    $position += strlen($value);
                }
            }

            $this->logger->info(sprintf('[%s] %s', $event->time, $sql));
        }
    }
}

<?php

declare(strict_types=1);

namespace App\Providers;

use Hypervel\Foundation\Support\Providers\RouteServiceProvider as BaseServiceProvider;
use Hypervel\Support\Facades\Route;

class RouteServiceProvider extends BaseServiceProvider
{
    /**
     * The route files for the application.
     */
    protected array $routes = [
    ];

    public function boot(): void
    {
        parent::boot();

        Route::group(
            '/api',
            base_path('routes/api.php'),
            ['middleware' => 'api']
        );

        Route::group(
            '/',
            base_path('routes/web.php'),
            ['middleware' => 'web']
        );
    }
}

<?php

declare(strict_types=1);

namespace App\Console;

use Hypervel\Console\Scheduling\Schedule;
use Hypervel\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * Define the application's command schedule.
     */
    public function schedule(Schedule $schedule): void
    {
        // $schedule->command('demo:hi')->everyFiveSeconds();
    }

    public function commands(): void
    {
        $this->load(__DIR__ . '/Commands');

        require base_path('routes/console.php');
    }
}

<?php

declare(strict_types=1);

use Hypervel\Support\Facades\Broadcast;

/*
|--------------------------------------------------------------------------
| Broadcast Channels
|--------------------------------------------------------------------------
|
| Here you may register all of the event broadcasting channels that your
| application supports. The given channel authorization callbacks are
| used to check if an authenticated user can listen to the channel.
|
*/

Broadcast::channel('App.Models.User.{id}', function ($user, $id) {
    return (int) $user->id === (int) $id;
});

<?php

declare(strict_types=1);

namespace App\Providers;

use Hypervel\Foundation\Support\Providers\EventServiceProvider as BaseServiceProvider;

class EventServiceProvider extends BaseServiceProvider
{
    /**
     * The event listener mappings for the application.
     */
    protected array $listen = [
        \App\Events\DemoEvent::class => [
            \App\Listeners\DemoListener::class,
        ],
    ];
}

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Router\Middleware\ValidateSignature as Middleware;

class ValidateSignature extends Middleware
{
    /**
     * The names of the query string parameters that should be ignored.
     *
     * @var array<int, string>
     */
    protected array $except = [
        // 'fbclid',
        // 'utm_campaign',
        // 'utm_content',
        // 'utm_medium',
        // 'utm_source',
        // 'utm_term',
    ];
}

<?php

declare(strict_types=1);

namespace App\Models;

use Hypervel\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    /**
     * The attributes that are mass assignable.
     */
    protected array $fillable = [
        'name',
        'email',
        'email_verified_at',
        'password',
    ];
}

<?php

declare(strict_types=1);

use Hypervel\Support\Facades\Artisan;
use Hypervel\Support\Facades\Schedule;

/*
|--------------------------------------------------------------------------
| Console Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of your Closure based console
| commands. Each Closure is bound to a command instance allowing a
| simple approach to interacting with each command's IO methods.
|
*/

Artisan::command('hello', function () {
    $this->comment('Hypervel is awesome!');
})->purpose('This is a demo closure command.');

// Schedule::command('hello')->everyFiveSeconds();

<?php

declare(strict_types=1);

return [
    /*
    |--------------------------------------------------------------------------
    | Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | The following language lines contain the default error messages used by
    | the validator class. Some of these rules have multiple versions such
    | as the size rules. Feel free to tweak each of these messages here.
    |
    */

    'accepted' => 'The :attribute must be accepted.',
    'accepted_if' => 'The :attribute must be accepted when :other is :value.',
    'active_url' => 'The :attribute is not a valid URL.',
    'after' => 'The :attribute must be a date after :date.',
    'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
    'alpha' => 'The :attribute may only contain letters.',
    'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
    'alpha_num' => 'The :attribute may only contain letters and numbers.',
    'array' => 'The :attribute must be an array.',
    'ascii' => 'The :attribute must only contain single-byte alphanumeric characters and symbols.',
    'before' => 'The :attribute must be a date before :date.',
    'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
    'between' => [
        'numeric' => 'The :attribute must be between :min and :max.',
        'file' => 'The :attribute must be between :min and :max kilobytes.',
        'string' => 'The :attribute must be between :min and :max characters.',
        'array' => 'The :attribute must have between :min and :max items.',
    ],
    'boolean' => 'The :attribute field must be true or false.',
    'confirmed' => 'The :attribute confirmation does not match.',
    'date' => 'The :attribute is not a valid date.',
    'date_equals' => 'The :attribute must be a date equal to :date.',
    'date_format' => 'The :attribute does not match the format :format.',
    'decimal' => 'The :attribute must have :decimal decimal places.',
    'declined' => 'The :attribute must be declined.',
    'declined_if' => 'The :attribute must be declined when :other is :value.',
    'different' => 'The :attribute and :other must be different.',
    'digits' => 'The :attribute must be :digits digits.',
    'digits_between' => 'The :attribute must be between :min and :max digits.',
    'dimensions' => 'The :attribute has invalid image dimensions.',
    'distinct' => 'The :attribute field has a duplicate value.',
    'doesnt_end_with' => 'The :attribute must not end with one of the following: :values.',
    'doesnt_start_with' => 'The :attribute must not start with one of the following: :values.',
    'email' => 'The :attribute must be a valid email address.',
    'ends_with' => 'The :attribute must end with one of the following: :values.',
    'exists' => 'The selected :attribute is invalid.',
    'file' => 'The :attribute must be a file.',
    'filled' => 'The :attribute field is required.',
    'gt' => [
        'numeric' => 'The :attribute must be greater than :value',
        'file' => 'The :attribute must be greater than :value kb',
        'string' => 'The :attribute must be greater than :value characters',
        'array' => 'The :attribute must be greater than :value items',
    ],
    'gte' => [
        'numeric' => 'The :attribute must be great than or equal to :value',
        'file' => 'The :attribute must be great than or equal to :value kb',
        'string' => 'The :attribute must be great than or equal to :value characters',
        'array' => 'The :attribute must be great than or equal to :value items',
    ],
    'image' => 'The :attribute must be an image.',
    'in' => 'The selected :attribute is invalid.',
    'in_array' => 'The :attribute field does not exist in :other.',
    'integer' => 'The :attribute must be an integer.',
    'ip' => 'The :attribute must be a valid IP address.',
    'ipv4' => 'The :attribute must be a valid IPv4 address.',
    'ipv6' => 'The :attribute must be a valid IPv6 address.',
    'json' => 'The :attribute must be a valid JSON string.',
    'list' => 'The :attribute must be a list.',
    'lowercase' => 'The :attribute must be lowercase.',
    'lt' => [
        'numeric' => 'The :attribute must be less than :value',
        'file' => 'The :attribute must be less than :value kb',
        'string' => 'The :attribute must be less than :value characters',
        'array' => 'The :attribute must be less than :value items',
    ],
    'lte' => [
        'numeric' => 'The :attribute must be less than or equal to :value',
        'file' => 'The :attribute must be less than or equal to :value kb',
        'string' => 'The :attribute must be less than or equal to :value characters',
        'array' => 'The :attribute must be less than or equal to :value items',
    ],
    'max' => [
        'numeric' => 'The :attribute may not be greater than :max.',
        'file' => 'The :attribute may not be greater than :max kilobytes.',
        'string' => 'The :attribute may not be greater than :max characters.',
        'array' => 'The :attribute may not have more than :max items.',
    ],
    'max_digits' => 'The :attribute must not have more than :max digits.',
    'mimes' => 'The :attribute must be a file of type: :values.',
    'mimetypes' => 'The :attribute must be a file of type: :values.',
    'min' => [
        'numeric' => 'The :attribute must be at least :min.',
        'file' => 'The :attribute must be at least :min kilobytes.',
        'string' => 'The :attribute must be at least :min characters.',
        'array' => 'The :attribute must have at least :min items.',
    ],
    'min_digits' => 'The :attribute must have at least :min digits.',
    'missing' => 'The :attribute must be missing.',
    'missing_if' => 'The :attribute must be missing when :other is :value.',
    'missing_unless' => 'The :attribute must be missing unless :other is :value.',
    'missing_with' => 'The :attribute must be missing when :values is present.',
    'missing_with_all' => 'The :attribute must be missing when :values are present.',
    'multiple_of' => 'The :attribute must be a multiple of :value.',
    'not_in' => 'The selected :attribute is invalid.',
    'not_regex' => 'The :attribute cannot match a given regular rule.',
    'numeric' => 'The :attribute must be a number.',
    'present' => 'The :attribute field must be present.',
    'prohibits' => 'The :attribute field must be present.',
    'regex' => 'The :attribute format is invalid.',
    'required' => 'The :attribute field is required.',
    'required_if' => 'The :attribute field is required when :other is :value.',
    'required_unless' => 'The :attribute field is required unless :other is in :values.',
    'required_with' => 'The :attribute field is required when :values is present.',
    'required_with_all' => 'The :attribute field is required when :values is present.',
    'required_without' => 'The :attribute field is required when :values is not present.',
    'required_without_all' => 'The :attribute field is required when none of :values are present.',
    'exclude' => 'The :attribute field is excluded.',
    'exclude_if' => 'The :attribute field is excluded when :other is :value.',
    'exclude_unless' => 'The :attribute field is excluded unless :other is in :values.',
    'exclude_with' => 'The :attribute field is excluded when :values is present.',
    'exclude_without' => 'The :attribute field is excluded when :values is not present.',
    'same' => 'The :attribute and :other must match.',
    'size' => [
        'numeric' => 'The :attribute must be :size.',
        'file' => 'The :attribute must be :size kilobytes.',
        'string' => 'The :attribute must be :size characters.',
        'array' => 'The :attribute must contain :size items.',
    ],
    'starts_with' => 'The :attribute must be start with :values ',
    'string' => 'The :attribute must be a string.',
    'timezone' => 'The :attribute must be a valid zone.',
    'unique' => 'The :attribute has already been taken.',
    'uploaded' => 'The :attribute failed to upload.',
    'uppercase' => 'The :attribute must be uppercase.',
    'url' => 'The :attribute format is invalid.',
    'ulid' => 'The :attribute must be a valid ULID.',
    'uuid' => 'The :attribute is invalid UUID.',
    'max_if' => [
        'numeric' => 'The :attribute may not be greater than :max when :other is :value.',
        'file' => 'The :attribute may not be greater than :max kilobytes when :other is :value.',
        'string' => 'The :attribute may not be greater than :max characters when :other is :value.',
        'array' => 'The :attribute may not have more than :max items when :other is :value.',
    ],
    'min_if' => [
        'numeric' => 'The :attribute must be at least :min when :other is :value.',
        'file' => 'The :attribute must be at least :min kilobytes when :other is :value.',
        'string' => 'The :attribute must be at least :min characters when :other is :value.',
        'array' => 'The :attribute must have at least :min items when :other is :value.',
    ],
    'between_if' => [
        'numeric' => 'The :attribute must be between :min and :max when :other is :value.',
        'file' => 'The :attribute must be between :min and :max kilobytes when :other is :value.',
        'string' => 'The :attribute must be between :min and :max characters when :other is :value.',
        'array' => 'The :attribute must have between :min and :max items when :other is :value.',
    ],
    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Attributes
    |--------------------------------------------------------------------------
    |
    | The following language lines are used to swap attribute place-holders
    | with something more reader friendly such as E-Mail Address instead
    | of "email". This simply helps us make messages a little cleaner.
    |
    */

    'attributes' => [],
    'phone_number' => 'The :attribute must be a valid phone number',
    'telephone_number' => 'The :attribute must be a valid telephone number',

    'chinese_word' => 'The :attribute must contain valid characters(chinese/english character, number, underscore)',
    'sequential_array' => 'The :attribute must be sequential array',
];

<?php

declare(strict_types=1);

return [
    /*
    |--------------------------------------------------------------------------
    | Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | The following language lines contain the default error messages used by
    | the validator class. Some of these rules have multiple versions such
    | as the size rules. Feel free to tweak each of these messages here.
    |
    */

    'accepted' => ':attribute 必须接受',
    'active_url' => ':attribute 必须是一个合法的 URL',
    'after' => ':attribute 必须是 :date 之后的一个日期',
    'after_or_equal' => ':attribute 必须是 :date 之后或相同的一个日期',
    'alpha' => ':attribute 只能包含字母',
    'alpha_dash' => ':attribute 只能包含字母、数字、中划线或下划线',
    'alpha_num' => ':attribute 只能包含字母和数字',
    'array' => ':attribute 必须是一个数组',
    'before' => ':attribute 必须是 :date 之前的一个日期',
    'before_or_equal' => ':attribute 必须是 :date 之前或相同的一个日期',
    'between' => [
        'numeric' => ':attribute 必须在 :min 到 :max 之间',
        'file' => ':attribute 必须在 :min 到 :max kb 之间',
        'string' => ':attribute 必须在 :min 到 :max 个字符之间',
        'array' => ':attribute 必须在 :min 到 :max 项之间',
    ],
    'boolean' => ':attribute 字符必须是 true 或 false, 1 或 0',
    'confirmed' => ':attribute 二次确认不匹配',
    'date' => ':attribute 必须是一个合法的日期',
    'date_format' => ':attribute 与给定的格式 :format 不符合',
    'decimal' => ':attribute 必须有 :decimal 位小数',
    'different' => ':attribute 必须不同于 :other',
    'digits' => ':attribute 必须是 :digits 位',
    'digits_between' => ':attribute 必须在 :min 和 :max 位之间',
    'dimensions' => ':attribute 具有无效的图片尺寸',
    'distinct' => ':attribute 字段具有重复值',
    'email' => ':attribute 必须是一个合法的电子邮件地址',
    'exists' => '选定的 :attribute 是无效的',
    'file' => ':attribute 必须是一个文件',
    'filled' => ':attribute 的字段是必填的',
    'gt' => [
        'numeric' => ':attribute 必须大于 :value',
        'file' => ':attribute 必须大于 :value kb',
        'string' => ':attribute 必须大于 :value 个字符',
        'array' => ':attribute 必须大于 :value 项',
    ],
    'gte' => [
        'numeric' => ':attribute 必须大于等于 :value',
        'file' => ':attribute 必须大于等于 :value kb',
        'string' => ':attribute 必须大于等于 :value 个字符',
        'array' => ':attribute 必须大于等于 :value 项',
    ],
    'image' => ':attribute 必须是 jpg, jpeg, png, bmp 或者 gif 格式的图片',
    'in' => '选定的 :attribute 是无效的',
    'in_array' => ':attribute 字段不存在于 :other',
    'integer' => ':attribute 必须是个整数',
    'ip' => ':attribute 必须是一个合法的 IP 地址',
    'ipv4' => ':attribute 必须是一个合法的 IPv4 地址',
    'ipv6' => ':attribute 必须是一个合法的 IPv6 地址',
    'json' => ':attribute 必须是一个合法的 JSON 字符串',
    'list' => ':attribute 必须是一个数组列表',
    'lt' => [
        'numeric' => ':attribute 必须小于 :value',
        'file' => ':attribute 必须小于 :value kb',
        'string' => ':attribute 必须小于 :value 个字符',
        'array' => ':attribute 必须小于 :value 项',
    ],
    'lte' => [
        'numeric' => ':attribute 必须小于等于 :value',
        'file' => ':attribute 必须小于等于 :value kb',
        'string' => ':attribute 必须小于等于 :value 个字符',
        'array' => ':attribute 必须小于等于 :value 项',
    ],
    'max' => [
        'numeric' => ':attribute 的最大值为 :max',
        'file' => ':attribute 的最大为 :max kb',
        'string' => ':attribute 的最大长度为 :max 字符',
        'array' => ':attribute 至多有 :max 项',
    ],
    'mimes' => ':attribute 的文件类型必须是 :values',
    'mimetypes' => ':attribute 的文件MIME必须是 :values',
    'min' => [
        'numeric' => ':attribute 的最小值为 :min',
        'file' => ':attribute 大小至少为 :min kb',
        'string' => ':attribute 的最小长度为 :min 字符',
        'array' => ':attribute 至少有 :min 项',
    ],
    'not_in' => '选定的 :attribute 是无效的',
    'not_regex' => ':attribute 不能匹配给定的正则',
    'numeric' => ':attribute 必须是数字',
    'present' => ':attribute 字段必须存在',
    'prohibits' => '必须提供 :attribute 字段',
    'regex' => ':attribute 格式是无效的',
    'required' => ':attribute 字段是必须的',
    'required_if' => ':attribute 字段是必须的当 :other 是 :value',
    'required_unless' => ':attribute 字段是必须的，除非 :other 是在 :values 中',
    'required_with' => ':attribute 字段是必须的当 :values 是存在的',
    'required_with_all' => ':attribute 字段是必须的当 :values 是存在的',
    'required_without' => ':attribute 字段是必须的当 :values 是不存在的',
    'required_without_all' => ':attribute 字段是必须的当 没有一个 :values 是存在的',
    'exclude' => ':attribute 字段是被排除的',
    'exclude_if' => '当 :other 为 :value 时，排除 :attribute 字段',
    'exclude_unless' => '除非 :other 是在 :values 中，否则排除 :attribute 字段',
    'exclude_with' => '当 :values 存在时，排除 :attribute 字段',
    'exclude_without' => '当 :values 不存在时，排除 :attribute 字段',
    'same' => ':attribute 和 :other 必须匹配',
    'size' => [
        'numeric' => ':attribute 必须是 :size',
        'file' => ':attribute 必须是 :size kb',
        'string' => ':attribute 必须是 :size 个字符',
        'array' => ':attribute 必须包括 :size 项',
    ],
    'starts_with' => ':attribute 必须以 :values 为开头',
    'string' => ':attribute 必须是一个字符串',
    'timezone' => ':attribute 必须是个有效的时区',
    'unique' => ':attribute 已存在',
    'uploaded' => ':attribute 上传失败',
    'url' => ':attribute 无效的格式',
    'uuid' => ':attribute 无效的UUID格式',
    'max_if' => [
        'numeric' => '当 :other 为 :value 时 :attribute 不能大于 :max',
        'file' => '当 :other 为 :value 时 :attribute 不能大于 :max kb',
        'string' => '当 :other 为 :value 时 :attribute 不能大于 :max 个字符',
        'array' => '当 :other 为 :value 时 :attribute 最多只有 :max 个单元',
    ],
    'min_if' => [
        'numeric' => '当 :other 为 :value 时 :attribute 必须大于等于 :min',
        'file' => '当 :other 为 :value 时 :attribute 大小不能小于 :min kb',
        'string' => '当 :other 为 :value 时 :attribute 至少为 :min 个字符',
        'array' => '当 :other 为 :value 时 :attribute 至少有 :min 个单元',
    ],
    'between_if' => [
        'numeric' => '当 :other 为 :value 时 :attribute 必须介于 :min - :max 之间',
        'file' => '当 :other 为 :value 时 :attribute 必须介于 :min - :max kb 之间',
        'string' => '当 :other 为 :value 时 :attribute 必须介于 :min - :max 个字符之间',
        'array' => '当 :other 为 :value 时 :attribute 必须只有 :min - :max 个单元',
    ],
    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Attributes
    |--------------------------------------------------------------------------
    |
    | The following language lines are used to swap attribute place-holders
    | with something more reader friendly such as E-Mail Address instead
    | of "email". This simply helps us make messages a little cleaner.
    |
    */

    'attributes' => [],
    'phone_number' => ':attribute 必须为一个有效的电话号码',
    'telephone_number' => ':attribute 必须为一个有效的手机号码',

    'chinese_word' => ':attribute 必须包含以下有效字符 (中文/英文，数字, 下划线)',
    'sequential_array' => ':attribute 必须是一个有序数组',
];

<?php

declare(strict_types=1);

return [
    /*
    |--------------------------------------------------------------------------
    | Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | The following language lines contain the default error messages used by
    | the validator class. Some of these rules have multiple versions such
    | as the size rules. Feel free to tweak each of these messages here.
    |
    */

    'accepted' => '必須接受 :attribute',
    'active_url' => ':attribute 必須是有效的網址',
    'after' => ':attribute 必須是 :date 之後的日期',
    'after_or_equal' => ':attribute 必須是 :date 之後或相同的日期',
    'alpha' => ':attribute 只能包含字母',
    'alpha_dash' => ':attribute 只能包含字母、數字、連接線或底線',
    'alpha_num' => ':attribute 只能包含字母和數字',
    'array' => ':attribute 必須是陣列',
    'before' => ':attribute 必須是 :date 之前的日期',
    'before_or_equal' => ':attribute 必須是 :date 之前或相同的日期',
    'between' => [
        'numeric' => ':attribute 必須介於 :min 至 :max 之間',
        'file' => ':attribute 必須介於 :min 至 :max KB 之間',
        'string' => ':attribute 必須介於 :min 至 :max 個字元之間',
        'array' => ':attribute 必須有 :min 至 :max 個項目',
    ],
    'boolean' => ':attribute 欄位必須是 true 或 false、1 或 0',
    'confirmed' => ':attribute 確認欄位不相符',
    'date' => ':attribute 必須是有效的日期',
    'date_format' => ':attribute 與格式 :format 不符',
    'decimal' => ':attribute 必須有 :decimal 位小數',
    'different' => ':attribute 與 :other 必須不同',
    'digits' => ':attribute 必須是 :digits 位數字',
    'digits_between' => ':attribute 必須介於 :min 至 :max 位數字',
    'dimensions' => ':attribute 圖片尺寸不正確',
    'distinct' => ':attribute 已經存在',
    'email' => ':attribute 必須是有效的電子郵件位址',
    'exists' => '所選擇的 :attribute 無效',
    'file' => ':attribute 必須是檔案',
    'filled' => ':attribute 不能留空',
    'gt' => [
        'numeric' => ':attribute 必須大於 :value',
        'file' => ':attribute 必須大於 :value KB',
        'string' => ':attribute 必須多於 :value 個字元',
        'array' => ':attribute 必須多於 :value 個項目',
    ],
    'gte' => [
        'numeric' => ':attribute 必須大於或等於 :value',
        'file' => ':attribute 必須大於或等於 :value KB',
        'string' => ':attribute 必須多於或等於 :value 個字元',
        'array' => ':attribute 必須多於或等於 :value 個項目',
    ],
    'image' => ':attribute 必須是 jpg、jpeg、png、bmp 或 gif 格式的圖片',
    'in' => '所選的 :attribute 無效',
    'in_array' => ':attribute 欄位不存在於 :other',
    'integer' => ':attribute 必須是整數',
    'ip' => ':attribute 必須是有效的 IP 位址',
    'ipv4' => ':attribute 必須是有效的 IPv4 位址',
    'ipv6' => ':attribute 必須是有效的 IPv6 位址',
    'json' => ':attribute 必須是有效的 JSON 字串',
    'list' => ':attribute 必須是陣列列表',
    'lt' => [
        'numeric' => ':attribute 必須小於 :value',
        'file' => ':attribute 必須小於 :value KB',
        'string' => ':attribute 必須少於 :value 個字元',
        'array' => ':attribute 必須少於 :value 個項目',
    ],
    'lte' => [
        'numeric' => ':attribute 必須小於或等於 :value',
        'file' => ':attribute 必須小於或等於 :value KB',
        'string' => ':attribute 必須少於或等於 :value 個字元',
        'array' => ':attribute 必須少於或等於 :value 個項目',
    ],
    'max' => [
        'numeric' => ':attribute 不能大於 :max',
        'file' => ':attribute 不能大於 :max KB',
        'string' => ':attribute 不能多於 :max 個字元',
        'array' => ':attribute 最多有 :max 個項目',
    ],
    'mimes' => ':attribute 必須為 :values 的檔案類型',
    'mimetypes' => ':attribute 必須為 :values 的檔案 MIME',
    'min' => [
        'numeric' => ':attribute 不能小於 :min',
        'file' => ':attribute 不能小於 :min KB',
        'string' => ':attribute 不能少於 :min 個字元',
        'array' => ':attribute 至少要有 :min 個項目',
    ],
    'not_in' => '所選擇的 :attribute 無效',
    'not_regex' => ':attribute 的格式錯誤',
    'numeric' => ':attribute 必須為數字',
    'present' => ':attribute 必須存在',
    'prohibits' => '必須提供 :attribute 欄位',
    'regex' => ':attribute 的格式錯誤',
    'required' => ':attribute 不能留空',
    'required_if' => '當 :other 是 :value 時 :attribute 不能留空',
    'required_unless' => '當 :other 不是 :values 時 :attribute 不能留空',
    'required_with' => '當 :values 出現時 :attribute 不能留空',
    'required_with_all' => '當 :values 出現時 :attribute 不能留空',
    'required_without' => '當 :values 留空時 :attribute 不能留空',
    'required_without_all' => '當 :values 都不出現時 :attribute 不能留空',
    'exclude' => ':attribute 欄位被排除',
    'exclude_if' => '當 :other 為 :value 時，排除 :attribute 欄位',
    'exclude_unless' => '除非 :other 在 :values 中，否則排除 :attribute 欄位',
    'exclude_with' => '當 :values 存在時，排除 :attribute 欄位',
    'exclude_without' => '當 :values 不存在時，排除 :attribute 欄位',
    'same' => ':attribute 與 :other 必須相同',
    'size' => [
        'numeric' => ':attribute 必須是 :size',
        'file' => ':attribute 必須是 :size KB',
        'string' => ':attribute 必須是 :size 個字元',
        'array' => ':attribute 必須包含 :size 個項目',
    ],
    'starts_with' => ':attribute 必須以 :values 開頭',
    'string' => ':attribute 必須是字串',
    'timezone' => ':attribute 必須是有效的時區',
    'unique' => ':attribute 已經存在',
    'uploaded' => ':attribute 上傳失敗',
    'url' => ':attribute 格式錯誤',
    'uuid' => ':attribute 必須是有效的 UUID',
    'max_if' => [
        'numeric' => '當 :other 為 :value 時 :attribute 不能大於 :max',
        'file' => '當 :other 為 :value 時 :attribute 不能大於 :max KB',
        'string' => '當 :other 為 :value 時 :attribute 不能多於 :max 個字元',
        'array' => '當 :other 為 :value 時 :attribute 最多只能有 :max 個項目',
    ],
    'min_if' => [
        'numeric' => '當 :other 為 :value 時 :attribute 不能小於 :min',
        'file' => '當 :other 為 :value 時 :attribute 不能小於 :min KB',
        'string' => '當 :other 為 :value 時 :attribute 不能少於 :min 個字元',
        'array' => '當 :other 為 :value 時 :attribute 至少要有 :min 個項目',
    ],
    'between_if' => [
        'numeric' => '當 :other 為 :value 時 :attribute 必須介於 :min 至 :max 之間',
        'file' => '當 :other 為 :value 時 :attribute 必須介於 :min 至 :max KB 之間',
        'string' => '當 :other 為 :value 時 :attribute 必須介於 :min 至 :max 個字元之間',
        'array' => '當 :other 為 :value 時 :attribute 必須有 :min 至 :max 個項目',
    ],
    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
    ],
    /*
    |--------------------------------------------------------------------------
    | Custom Validation Attributes
    |--------------------------------------------------------------------------
    |
    | The following language lines are used to swap attribute place-holders
    | with something more reader friendly such as E-Mail Address instead
    | of "email". This simply helps us make messages a little cleaner.
    |
    */

    'attributes' => [],
    'phone_number' => ':attribute 必須是有效的電話號碼',
    'telephone_number' => ':attribute 必須是有效的手機號碼',
    'chinese_word' => ':attribute 必須包含有效的字元（中文/英文、數字、底線）',
    'sequential_array' => ':attribute 必須是有序陣列',
];

<?php

declare(strict_types=1);

namespace App\Listeners;

use Hypervel\Support\Facades\Log;

class DemoListener
{
    public function handle(object $event): void
    {
        Log::info('Demo listener is triggered.');
    }
}

<?php

declare(strict_types=1);

use App\Http\Controllers\IndexController;
use Hypervel\Support\Facades\Route;

Route::any('/', [IndexController::class, 'index']);

<?php

declare(strict_types=1);

namespace App\Providers;

use Hypervel\Support\Facades\Broadcast;
use Hypervel\Support\ServiceProvider;

class BroadcastServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Broadcast::routes();

        require base_path('routes/channels.php');
    }
}

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Foundation\Http\Middleware\TrimStrings as Middleware;

class TrimStrings extends Middleware
{
    /**
     * The names of the attributes that should not be trimmed.
     *
     * @var array<int, string>
     */
    protected array $except = [
    ];
}

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array<int, string>
     */
    protected array $except = [
    ];
}

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Foundation\Http\Middleware\ConvertEmptyStringsToNull as Middleware;

class ConvertEmptyStringsToNull extends Middleware
{
    /**
     * The names of the attributes that should not be transformed to null.
     *
     * @var array<int, string>
     */
    protected array $except = [
    ];
}

<?php

declare(strict_types=1);

namespace App\Http\Controllers;

abstract class AbstractController
{
}

<?php

declare(strict_types=1);

namespace App\Models;

use Hypervel\Database\Eloquent\Model as BaseModel;

abstract class Model extends BaseModel
{
    protected ?string $connection = null;
}

<?php

declare(strict_types=1);

namespace App\Providers;

use Hypervel\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
    }

    public function register(): void
    {
    }
}

<?php

declare(strict_types=1);

use Hypervel\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
}

<?php

declare(strict_types=1);

namespace App\Events;

class DemoEvent
{
}

class
IndexController
extends AbstractController
{
public function index (Request $request) : array {}
}

This code segment functions to: Process incoming HTTP requests by retrieving specified input parameters and request method details, then generate a structured response containing protocol information and a dynamically constructed greeting message based on provided values.

```php
[TASK_BEGIN]
class IndexController extends AbstractController
{
    public function index(Request $request): array
    {
        return [
            'hello' => 'world'
        ];
    }
}
[TASK_END]
```


<?php

declare(strict_types=1);

namespace App\Exceptions;

use Hypervel\Foundation\Exceptions\Handler as ExceptionHandler;
use Hypervel\Http\Request;
use Throwable;

class Handler extends ExceptionHandler
{
    protected array $dontFlash = [
        'current_password',
        'password',
        'password_confirmation',
    ];
    public function register(): void
    {
        $this->shouldRenderJsonWhen(function (Request $request, Throwable $e) {
            return str_starts_with($path = $request->path(), 'api')
                && (strlen($path) === 3 || $path[3] === '/');
        });
        $this->reportable(function (Throwable $e) {
        });
    }
}

<?php

declare(strict_types=1);

namespace App\Listeners;

use Hyperf\Collection\Arr;
use Hyperf\Database\Events\QueryExecuted;
use Hyperf\Event\Contract\ListenerInterface;
use Hyperf\Framework\Logger\StdoutLogger;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;

class DbQueryExecutedListener implements ListenerInterface
{
    private LoggerInterface $logger;

    public function __construct(ContainerInterface $container)
    {
        $this->logger = $container->get(StdoutLogger::class);
    }

    public function listen(): array
    {
        return [
            QueryExecuted::class,
        ];
    }

    /**
     * @param QueryExecuted $event
     */
    public function process(object $event): void
    {
        if ($event instanceof QueryExecuted) {
            $sql = $event->sql;
            if (! Arr::isAssoc($event->bindings)) {
                $position = 0;
                foreach ($event->bindings as $value) {
                    $position = strpos($sql, '?', $position);
                    if ($position === false) {
                        break;
                    }
                    $value = "'{$value}'";
                    $sql = substr_replace($sql, $value, $position, 1);
                    $position += strlen($value);
                }
            }

            $this->logger->info(sprintf('[%s] %s', $event->time, $sql));
        }
    }
}

<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use Hypervel\Http\Request;

class IndexController extends AbstractController
{
    public function index(Request $request): array
    {
        $user = $request->input('user', 'Hypervel');
        $method = $request->getMethod();

        return [
            'method' => $method,
            'message' => "Hello {$user}.",
        ];
    }
}

<?php

declare(strict_types=1);

namespace App\Http\Requests;

use Hypervel\Foundation\Http\FormRequest;

class DemoRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     */
    public function rules(): array
    {
        return [
            'name' => 'required|string|min:3',
            'email' => 'required|email',
            'email2' => 'required|array',
        ];
    }
}

<?php

declare(strict_types=1);

use Hypervel\Support\Facades\Broadcast;

/*
|--------------------------------------------------------------------------
| Broadcast Channels
|--------------------------------------------------------------------------
|
| Here you may register all of the event broadcasting channels that your
| application supports. The given channel authorization callbacks are
| used to check if an authenticated user can listen to the channel.
|
*/

Broadcast::channel('App.Models.User.{id}', function ($user, $id) {
    return (int) $user->id === (int) $id;
});

<?php

declare(strict_types=1);

namespace App\Providers;

use Hypervel\Foundation\Support\Providers\RouteServiceProvider as BaseServiceProvider;
use Hypervel\Support\Facades\Route;

class RouteServiceProvider extends BaseServiceProvider
{
    /**
     * The route files for the application.
     */
    protected array $routes = [
    ];

    public function boot(): void
    {
        parent::boot();

        Route::group(
            '/api',
            base_path('routes/api.php'),
            ['middleware' => 'api']
        );

        Route::group(
            '/',
            base_path('routes/web.php'),
            ['middleware' => 'web']
        );
    }
}

<?php

declare(strict_types=1);

namespace App\Console\Commands;

use Hypervel\Console\Command;

class DemoCommand extends Command
{
    protected ?string $signature = 'demo:hi {--name=}';

    protected string $description = 'Hyperf Demo Command';

    public function handle()
    {
        $this->info('Hello ' . ($this->option('name') ?: 'Hypervel'));
    }
}

<?php

declare(strict_types=1);

namespace App\Console;

use Hypervel\Console\Scheduling\Schedule;
use Hypervel\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * Define the application's command schedule.
     */
    public function schedule(Schedule $schedule): void
    {
        // $schedule->command('demo:hi')->everyFiveSeconds();
    }

    public function commands(): void
    {
        $this->load(__DIR__ . '/Commands');

        require base_path('routes/console.php');
    }
}

<?php

declare(strict_types=1);

namespace App\Models;

use Hypervel\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    /**
     * The attributes that are mass assignable.
     */
    protected array $fillable = [
        'name',
        'email',
        'email_verified_at',
        'password',
    ];
}

<?php

declare(strict_types=1);

namespace App\Http;

use Hypervel\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array<int, class-string|string>
     */
    protected array $middleware = [
        // \App\Http\Middleware\TrimStrings::class,
        // \App\Http\Middleware\ConvertEmptyStringsToNull::class
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected array $middlewareGroups = [
        'web' => [
            // \Hypervel\Router\Middleware\SubstituteBindings::class,
            // \Hypervel\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            // \Hypervel\Session\Middleware\StartSession::class,
            // \Hypervel\View\Middleware\ShareErrorsFromSession::class,
            // \App\Http\Middleware\VerifyCsrfToken::class,
        ],

        'api' => [
            // 'throttle:60,1,api',
            // \Hypervel\Router\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * The application's middleware aliases.
     *
     * Aliases may be used instead of class names to conveniently assign middleware to routes and groups.
     *
     * @var array<string, class-string|string>
     */
    protected array $middlewareAliases = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'can' => \Hypervel\Auth\Middleware\Authorize::class,
        'throttle' => \Hypervel\Router\Middleware\ThrottleRequests::class,
        'bindings' => \Hypervel\Router\Middleware\SubstituteBindings::class,
        'signed' => \App\Http\Middleware\ValidateSignature::class,
    ];

    /**
     * The priority-sorted list of middleware.
     *
     * Forces non-global middleware to always be in the given order.
     *
     * @var string[]
     */
    protected array $middlewarePriority = [
        // \Hypervel\Router\Middleware\ThrottleRequests::class,
        // \Hypervel\Router\Middleware\SubstituteBindings::class,
        // \Hypervel\Session\Middleware\StartSession::class,
        // \Hypervel\View\Middleware\ShareErrorsFromSession::class,
        // \App\Http\Middleware\VerifyCsrfToken::class,
    ];
}

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Router\Middleware\ValidateSignature as Middleware;

class ValidateSignature extends Middleware
{
    /**
     * The names of the query string parameters that should be ignored.
     *
     * @var array<int, string>
     */
    protected array $except = [
        // 'fbclid',
        // 'utm_campaign',
        // 'utm_content',
        // 'utm_medium',
        // 'utm_source',
        // 'utm_term',
    ];
}

<?php

declare(strict_types=1);

return [
    /*
    |--------------------------------------------------------------------------
    | Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | The following language lines contain the default error messages used by
    | the validator class. Some of these rules have multiple versions such
    | as the size rules. Feel free to tweak each of these messages here.
    |
    */

    'accepted' => ':attribute 必须接受',
    'active_url' => ':attribute 必须是一个合法的 URL',
    'after' => ':attribute 必须是 :date 之后的一个日期',
    'after_or_equal' => ':attribute 必须是 :date 之后或相同的一个日期',
    'alpha' => ':attribute 只能包含字母',
    'alpha_dash' => ':attribute 只能包含字母、数字、中划线或下划线',
    'alpha_num' => ':attribute 只能包含字母和数字',
    'array' => ':attribute 必须是一个数组',
    'before' => ':attribute 必须是 :date 之前的一个日期',
    'before_or_equal' => ':attribute 必须是 :date 之前或相同的一个日期',
    'between' => [
        'numeric' => ':attribute 必须在 :min 到 :max 之间',
        'file' => ':attribute 必须在 :min 到 :max kb 之间',
        'string' => ':attribute 必须在 :min 到 :max 个字符之间',
        'array' => ':attribute 必须在 :min 到 :max 项之间',
    ],
    'boolean' => ':attribute 字符必须是 true 或 false, 1 或 0',
    'confirmed' => ':attribute 二次确认不匹配',
    'date' => ':attribute 必须是一个合法的日期',
    'date_format' => ':attribute 与给定的格式 :format 不符合',
    'decimal' => ':attribute 必须有 :decimal 位小数',
    'different' => ':attribute 必须不同于 :other',
    'digits' => ':attribute 必须是 :digits 位',
    'digits_between' => ':attribute 必须在 :min 和 :max 位之间',
    'dimensions' => ':attribute 具有无效的图片尺寸',
    'distinct' => ':attribute 字段具有重复值',
    'email' => ':attribute 必须是一个合法的电子邮件地址',
    'exists' => '选定的 :attribute 是无效的',
    'file' => ':attribute 必须是一个文件',
    'filled' => ':attribute 的字段是必填的',
    'gt' => [
        'numeric' => ':attribute 必须大于 :value',
        'file' => ':attribute 必须大于 :value kb',
        'string' => ':attribute 必须大于 :value 个字符',
        'array' => ':attribute 必须大于 :value 项',
    ],
    'gte' => [
        'numeric' => ':attribute 必须大于等于 :value',
        'file' => ':attribute 必须大于等于 :value kb',
        'string' => ':attribute 必须大于等于 :value 个字符',
        'array' => ':attribute 必须大于等于 :value 项',
    ],
    'image' => ':attribute 必须是 jpg, jpeg, png, bmp 或者 gif 格式的图片',
    'in' => '选定的 :attribute 是无效的',
    'in_array' => ':attribute 字段不存在于 :other',
    'integer' => ':attribute 必须是个整数',
    'ip' => ':attribute 必须是一个合法的 IP 地址',
    'ipv4' => ':attribute 必须是一个合法的 IPv4 地址',
    'ipv6' => ':attribute 必须是一个合法的 IPv6 地址',
    'json' => ':attribute 必须是一个合法的 JSON 字符串',
    'list' => ':attribute 必须是一个数组列表',
    'lt' => [
        'numeric' => ':attribute 必须小于 :value',
        'file' => ':attribute 必须小于 :value kb',
        'string' => ':attribute 必须小于 :value 个字符',
        'array' => ':attribute 必须小于 :value 项',
    ],
    'lte' => [
        'numeric' => ':attribute 必须小于等于 :value',
        'file' => ':attribute 必须小于等于 :value kb',
        'string' => ':attribute 必须小于等于 :value 个字符',
        'array' => ':attribute 必须小于等于 :value 项',
    ],
    'max' => [
        'numeric' => ':attribute 的最大值为 :max',
        'file' => ':attribute 的最大为 :max kb',
        'string' => ':attribute 的最大长度为 :max 字符',
        'array' => ':attribute 至多有 :max 项',
    ],
    'mimes' => ':attribute 的文件类型必须是 :values',
    'mimetypes' => ':attribute 的文件MIME必须是 :values',
    'min' => [
        'numeric' => ':attribute 的最小值为 :min',
        'file' => ':attribute 大小至少为 :min kb',
        'string' => ':attribute 的最小长度为 :min 字符',
        'array' => ':attribute 至少有 :min 项',
    ],
    'not_in' => '选定的 :attribute 是无效的',
    'not_regex' => ':attribute 不能匹配给定的正则',
    'numeric' => ':attribute 必须是数字',
    'present' => ':attribute 字段必须存在',
    'prohibits' => '必须提供 :attribute 字段',
    'regex' => ':attribute 格式是无效的',
    'required' => ':attribute 字段是必须的',
    'required_if' => ':attribute 字段是必须的当 :other 是 :value',
    'required_unless' => ':attribute 字段是必须的，除非 :other 是在 :values 中',
    'required_with' => ':attribute 字段是必须的当 :values 是存在的',
    'required_with_all' => ':attribute 字段是必须的当 :values 是存在的',
    'required_without' => ':attribute 字段是必须的当 :values 是不存在的',
    'required_without_all' => ':attribute 字段是必须的当 没有一个 :values 是存在的',
    'exclude' => ':attribute 字段是被排除的',
    'exclude_if' => '当 :other 为 :value 时，排除 :attribute 字段',
    'exclude_unless' => '除非 :other 是在 :values 中，否则排除 :attribute 字段',
    'exclude_with' => '当 :values 存在时，排除 :attribute 字段',
    'exclude_without' => '当 :values 不存在时，排除 :attribute 字段',
    'same' => ':attribute 和 :other 必须匹配',
    'size' => [
        'numeric' => ':attribute 必须是 :size',
        'file' => ':attribute 必须是 :size kb',
        'string' => ':attribute 必须是 :size 个字符',
        'array' => ':attribute 必须包括 :size 项',
    ],
    'starts_with' => ':attribute 必须以 :values 为开头',
    'string' => ':attribute 必须是一个字符串',
    'timezone' => ':attribute 必须是个有效的时区',
    'unique' => ':attribute 已存在',
    'uploaded' => ':attribute 上传失败',
    'url' => ':attribute 无效的格式',
    'uuid' => ':attribute 无效的UUID格式',
    'max_if' => [
        'numeric' => '当 :other 为 :value 时 :attribute 不能大于 :max',
        'file' => '当 :other 为 :value 时 :attribute 不能大于 :max kb',
        'string' => '当 :other 为 :value 时 :attribute 不能大于 :max 个字符',
        'array' => '当 :other 为 :value 时 :attribute 最多只有 :max 个单元',
    ],
    'min_if' => [
        'numeric' => '当 :other 为 :value 时 :attribute 必须大于等于 :min',
        'file' => '当 :other 为 :value 时 :attribute 大小不能小于 :min kb',
        'string' => '当 :other 为 :value 时 :attribute 至少为 :min 个字符',
        'array' => '当 :other 为 :value 时 :attribute 至少有 :min 个单元',
    ],
    'between_if' => [
        'numeric' => '当 :other 为 :value 时 :attribute 必须介于 :min - :max 之间',
        'file' => '当 :other 为 :value 时 :attribute 必须介于 :min - :max kb 之间',
        'string' => '当 :other 为 :value 时 :attribute 必须介于 :min - :max 个字符之间',
        'array' => '当 :other 为 :value 时 :attribute 必须只有 :min - :max 个单元',
    ],
    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Attributes
    |--------------------------------------------------------------------------
    |
    | The following language lines are used to swap attribute place-holders
    | with something more reader friendly such as E-Mail Address instead
    | of "email". This simply helps us make messages a little cleaner.
    |
    */

    'attributes' => [],
    'phone_number' => ':attribute 必须为一个有效的电话号码',
    'telephone_number' => ':attribute 必须为一个有效的手机号码',

    'chinese_word' => ':attribute 必须包含以下有效字符 (中文/英文，数字, 下划线)',
    'sequential_array' => ':attribute 必须是一个有序数组',
];

<?php

declare(strict_types=1);

namespace App\Providers;

use Hypervel\Foundation\Support\Providers\EventServiceProvider as BaseServiceProvider;

class EventServiceProvider extends BaseServiceProvider
{
    /**
     * The event listener mappings for the application.
     */
    protected array $listen = [
        \App\Events\DemoEvent::class => [
            \App\Listeners\DemoListener::class,
        ],
    ];
}

<?php

declare(strict_types=1);

namespace App\Providers;

use Hypervel\Support\Facades\Broadcast;
use Hypervel\Support\ServiceProvider;

class BroadcastServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Broadcast::routes();

        require base_path('routes/channels.php');
    }
}

<?php

declare(strict_types=1);

return [
    /*
    |--------------------------------------------------------------------------
    | Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | The following language lines contain the default error messages used by
    | the validator class. Some of these rules have multiple versions such
    | as the size rules. Feel free to tweak each of these messages here.
    |
    */

    'accepted' => '必須接受 :attribute',
    'active_url' => ':attribute 必須是有效的網址',
    'after' => ':attribute 必須是 :date 之後的日期',
    'after_or_equal' => ':attribute 必須是 :date 之後或相同的日期',
    'alpha' => ':attribute 只能包含字母',
    'alpha_dash' => ':attribute 只能包含字母、數字、連接線或底線',
    'alpha_num' => ':attribute 只能包含字母和數字',
    'array' => ':attribute 必須是陣列',
    'before' => ':attribute 必須是 :date 之前的日期',
    'before_or_equal' => ':attribute 必須是 :date 之前或相同的日期',
    'between' => [
        'numeric' => ':attribute 必須介於 :min 至 :max 之間',
        'file' => ':attribute 必須介於 :min 至 :max KB 之間',
        'string' => ':attribute 必須介於 :min 至 :max 個字元之間',
        'array' => ':attribute 必須有 :min 至 :max 個項目',
    ],
    'boolean' => ':attribute 欄位必須是 true 或 false、1 或 0',
    'confirmed' => ':attribute 確認欄位不相符',
    'date' => ':attribute 必須是有效的日期',
    'date_format' => ':attribute 與格式 :format 不符',
    'decimal' => ':attribute 必須有 :decimal 位小數',
    'different' => ':attribute 與 :other 必須不同',
    'digits' => ':attribute 必須是 :digits 位數字',
    'digits_between' => ':attribute 必須介於 :min 至 :max 位數字',
    'dimensions' => ':attribute 圖片尺寸不正確',
    'distinct' => ':attribute 已經存在',
    'email' => ':attribute 必須是有效的電子郵件位址',
    'exists' => '所選擇的 :attribute 無效',
    'file' => ':attribute 必須是檔案',
    'filled' => ':attribute 不能留空',
    'gt' => [
        'numeric' => ':attribute 必須大於 :value',
        'file' => ':attribute 必須大於 :value KB',
        'string' => ':attribute 必須多於 :value 個字元',
        'array' => ':attribute 必須多於 :value 個項目',
    ],
    'gte' => [
        'numeric' => ':attribute 必須大於或等於 :value',
        'file' => ':attribute 必須大於或等於 :value KB',
        'string' => ':attribute 必須多於或等於 :value 個字元',
        'array' => ':attribute 必須多於或等於 :value 個項目',
    ],
    'image' => ':attribute 必須是 jpg、jpeg、png、bmp 或 gif 格式的圖片',
    'in' => '所選的 :attribute 無效',
    'in_array' => ':attribute 欄位不存在於 :other',
    'integer' => ':attribute 必須是整數',
    'ip' => ':attribute 必須是有效的 IP 位址',
    'ipv4' => ':attribute 必須是有效的 IPv4 位址',
    'ipv6' => ':attribute 必須是有效的 IPv6 位址',
    'json' => ':attribute 必須是有效的 JSON 字串',
    'list' => ':attribute 必須是陣列列表',
    'lt' => [
        'numeric' => ':attribute 必須小於 :value',
        'file' => ':attribute 必須小於 :value KB',
        'string' => ':attribute 必須少於 :value 個字元',
        'array' => ':attribute 必須少於 :value 個項目',
    ],
    'lte' => [
        'numeric' => ':attribute 必須小於或等於 :value',
        'file' => ':attribute 必須小於或等於 :value KB',
        'string' => ':attribute 必須少於或等於 :value 個字元',
        'array' => ':attribute 必須少於或等於 :value 個項目',
    ],
    'max' => [
        'numeric' => ':attribute 不能大於 :max',
        'file' => ':attribute 不能大於 :max KB',
        'string' => ':attribute 不能多於 :max 個字元',
        'array' => ':attribute 最多有 :max 個項目',
    ],
    'mimes' => ':attribute 必須為 :values 的檔案類型',
    'mimetypes' => ':attribute 必須為 :values 的檔案 MIME',
    'min' => [
        'numeric' => ':attribute 不能小於 :min',
        'file' => ':attribute 不能小於 :min KB',
        'string' => ':attribute 不能少於 :min 個字元',
        'array' => ':attribute 至少要有 :min 個項目',
    ],
    'not_in' => '所選擇的 :attribute 無效',
    'not_regex' => ':attribute 的格式錯誤',
    'numeric' => ':attribute 必須為數字',
    'present' => ':attribute 必須存在',
    'prohibits' => '必須提供 :attribute 欄位',
    'regex' => ':attribute 的格式錯誤',
    'required' => ':attribute 不能留空',
    'required_if' => '當 :other 是 :value 時 :attribute 不能留空',
    'required_unless' => '當 :other 不是 :values 時 :attribute 不能留空',
    'required_with' => '當 :values 出現時 :attribute 不能留空',
    'required_with_all' => '當 :values 出現時 :attribute 不能留空',
    'required_without' => '當 :values 留空時 :attribute 不能留空',
    'required_without_all' => '當 :values 都不出現時 :attribute 不能留空',
    'exclude' => ':attribute 欄位被排除',
    'exclude_if' => '當 :other 為 :value 時，排除 :attribute 欄位',
    'exclude_unless' => '除非 :other 在 :values 中，否則排除 :attribute 欄位',
    'exclude_with' => '當 :values 存在時，排除 :attribute 欄位',
    'exclude_without' => '當 :values 不存在時，排除 :attribute 欄位',
    'same' => ':attribute 與 :other 必須相同',
    'size' => [
        'numeric' => ':attribute 必須是 :size',
        'file' => ':attribute 必須是 :size KB',
        'string' => ':attribute 必須是 :size 個字元',
        'array' => ':attribute 必須包含 :size 個項目',
    ],
    'starts_with' => ':attribute 必須以 :values 開頭',
    'string' => ':attribute 必須是字串',
    'timezone' => ':attribute 必須是有效的時區',
    'unique' => ':attribute 已經存在',
    'uploaded' => ':attribute 上傳失敗',
    'url' => ':attribute 格式錯誤',
    'uuid' => ':attribute 必須是有效的 UUID',
    'max_if' => [
        'numeric' => '當 :other 為 :value 時 :attribute 不能大於 :max',
        'file' => '當 :other 為 :value 時 :attribute 不能大於 :max KB',
        'string' => '當 :other 為 :value 時 :attribute 不能多於 :max 個字元',
        'array' => '當 :other 為 :value 時 :attribute 最多只能有 :max 個項目',
    ],
    'min_if' => [
        'numeric' => '當 :other 為 :value 時 :attribute 不能小於 :min',
        'file' => '當 :other 為 :value 時 :attribute 不能小於 :min KB',
        'string' => '當 :other 為 :value 時 :attribute 不能少於 :min 個字元',
        'array' => '當 :other 為 :value 時 :attribute 至少要有 :min 個項目',
    ],
    'between_if' => [
        'numeric' => '當 :other 為 :value 時 :attribute 必須介於 :min 至 :max 之間',
        'file' => '當 :other 為 :value 時 :attribute 必須介於 :min 至 :max KB 之間',
        'string' => '當 :other 為 :value 時 :attribute 必須介於 :min 至 :max 個字元之間',
        'array' => '當 :other 為 :value 時 :attribute 必須有 :min 至 :max 個項目',
    ],
    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
    ],
    /*
    |--------------------------------------------------------------------------
    | Custom Validation Attributes
    |--------------------------------------------------------------------------
    |
    | The following language lines are used to swap attribute place-holders
    | with something more reader friendly such as E-Mail Address instead
    | of "email". This simply helps us make messages a little cleaner.
    |
    */

    'attributes' => [],
    'phone_number' => ':attribute 必須是有效的電話號碼',
    'telephone_number' => ':attribute 必須是有效的手機號碼',
    'chinese_word' => ':attribute 必須包含有效的字元（中文/英文、數字、底線）',
    'sequential_array' => ':attribute 必須是有序陣列',
];

<?php

declare(strict_types=1);

namespace App\Listeners;

use Hypervel\Support\Facades\Log;

class DemoListener
{
    public function handle(object $event): void
    {
        Log::info('Demo listener is triggered.');
    }
}

<?php

declare(strict_types=1);

use Hypervel\Support\Facades\Artisan;
use Hypervel\Support\Facades\Schedule;

/*
|--------------------------------------------------------------------------
| Console Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of your Closure based console
| commands. Each Closure is bound to a command instance allowing a
| simple approach to interacting with each command's IO methods.
|
*/

Artisan::command('hello', function () {
    $this->comment('Hypervel is awesome!');
})->purpose('This is a demo closure command.');

// Schedule::command('hello')->everyFiveSeconds();

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Foundation\Http\Middleware\TrimStrings as Middleware;

class TrimStrings extends Middleware
{
    /**
     * The names of the attributes that should not be trimmed.
     *
     * @var array<int, string>
     */
    protected array $except = [
    ];
}

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array<int, string>
     */
    protected array $except = [
    ];
}

<?php

declare(strict_types=1);

return [
    /*
    |--------------------------------------------------------------------------
    | Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | The following language lines contain the default error messages used by
    | the validator class. Some of these rules have multiple versions such
    | as the size rules. Feel free to tweak each of these messages here.
    |
    */

    'accepted' => 'The :attribute must be accepted.',
    'accepted_if' => 'The :attribute must be accepted when :other is :value.',
    'active_url' => 'The :attribute is not a valid URL.',
    'after' => 'The :attribute must be a date after :date.',
    'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
    'alpha' => 'The :attribute may only contain letters.',
    'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
    'alpha_num' => 'The :attribute may only contain letters and numbers.',
    'array' => 'The :attribute must be an array.',
    'ascii' => 'The :attribute must only contain single-byte alphanumeric characters and symbols.',
    'before' => 'The :attribute must be a date before :date.',
    'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
    'between' => [
        'numeric' => 'The :attribute must be between :min and :max.',
        'file' => 'The :attribute must be between :min and :max kilobytes.',
        'string' => 'The :attribute must be between :min and :max characters.',
        'array' => 'The :attribute must have between :min and :max items.',
    ],
    'boolean' => 'The :attribute field must be true or false.',
    'confirmed' => 'The :attribute confirmation does not match.',
    'date' => 'The :attribute is not a valid date.',
    'date_equals' => 'The :attribute must be a date equal to :date.',
    'date_format' => 'The :attribute does not match the format :format.',
    'decimal' => 'The :attribute must have :decimal decimal places.',
    'declined' => 'The :attribute must be declined.',
    'declined_if' => 'The :attribute must be declined when :other is :value.',
    'different' => 'The :attribute and :other must be different.',
    'digits' => 'The :attribute must be :digits digits.',
    'digits_between' => 'The :attribute must be between :min and :max digits.',
    'dimensions' => 'The :attribute has invalid image dimensions.',
    'distinct' => 'The :attribute field has a duplicate value.',
    'doesnt_end_with' => 'The :attribute must not end with one of the following: :values.',
    'doesnt_start_with' => 'The :attribute must not start with one of the following: :values.',
    'email' => 'The :attribute must be a valid email address.',
    'ends_with' => 'The :attribute must end with one of the following: :values.',
    'exists' => 'The selected :attribute is invalid.',
    'file' => 'The :attribute must be a file.',
    'filled' => 'The :attribute field is required.',
    'gt' => [
        'numeric' => 'The :attribute must be greater than :value',
        'file' => 'The :attribute must be greater than :value kb',
        'string' => 'The :attribute must be greater than :value characters',
        'array' => 'The :attribute must be greater than :value items',
    ],
    'gte' => [
        'numeric' => 'The :attribute must be great than or equal to :value',
        'file' => 'The :attribute must be great than or equal to :value kb',
        'string' => 'The :attribute must be great than or equal to :value characters',
        'array' => 'The :attribute must be great than or equal to :value items',
    ],
    'image' => 'The :attribute must be an image.',
    'in' => 'The selected :attribute is invalid.',
    'in_array' => 'The :attribute field does not exist in :other.',
    'integer' => 'The :attribute must be an integer.',
    'ip' => 'The :attribute must be a valid IP address.',
    'ipv4' => 'The :attribute must be a valid IPv4 address.',
    'ipv6' => 'The :attribute must be a valid IPv6 address.',
    'json' => 'The :attribute must be a valid JSON string.',
    'list' => 'The :attribute must be a list.',
    'lowercase' => 'The :attribute must be lowercase.',
    'lt' => [
        'numeric' => 'The :attribute must be less than :value',
        'file' => 'The :attribute must be less than :value kb',
        'string' => 'The :attribute must be less than :value characters',
        'array' => 'The :attribute must be less than :value items',
    ],
    'lte' => [
        'numeric' => 'The :attribute must be less than or equal to :value',
        'file' => 'The :attribute must be less than or equal to :value kb',
        'string' => 'The :attribute must be less than or equal to :value characters',
        'array' => 'The :attribute must be less than or equal to :value items',
    ],
    'max' => [
        'numeric' => 'The :attribute may not be greater than :max.',
        'file' => 'The :attribute may not be greater than :max kilobytes.',
        'string' => 'The :attribute may not be greater than :max characters.',
        'array' => 'The :attribute may not have more than :max items.',
    ],
    'max_digits' => 'The :attribute must not have more than :max digits.',
    'mimes' => 'The :attribute must be a file of type: :values.',
    'mimetypes' => 'The :attribute must be a file of type: :values.',
    'min' => [
        'numeric' => 'The :attribute must be at least :min.',
        'file' => 'The :attribute must be at least :min kilobytes.',
        'string' => 'The :attribute must be at least :min characters.',
        'array' => 'The :attribute must have at least :min items.',
    ],
    'min_digits' => 'The :attribute must have at least :min digits.',
    'missing' => 'The :attribute must be missing.',
    'missing_if' => 'The :attribute must be missing when :other is :value.',
    'missing_unless' => 'The :attribute must be missing unless :other is :value.',
    'missing_with' => 'The :attribute must be missing when :values is present.',
    'missing_with_all' => 'The :attribute must be missing when :values are present.',
    'multiple_of' => 'The :attribute must be a multiple of :value.',
    'not_in' => 'The selected :attribute is invalid.',
    'not_regex' => 'The :attribute cannot match a given regular rule.',
    'numeric' => 'The :attribute must be a number.',
    'present' => 'The :attribute field must be present.',
    'prohibits' => 'The :attribute field must be present.',
    'regex' => 'The :attribute format is invalid.',
    'required' => 'The :attribute field is required.',
    'required_if' => 'The :attribute field is required when :other is :value.',
    'required_unless' => 'The :attribute field is required unless :other is in :values.',
    'required_with' => 'The :attribute field is required when :values is present.',
    'required_with_all' => 'The :attribute field is required when :values is present.',
    'required_without' => 'The :attribute field is required when :values is not present.',
    'required_without_all' => 'The :attribute field is required when none of :values are present.',
    'exclude' => 'The :attribute field is excluded.',
    'exclude_if' => 'The :attribute field is excluded when :other is :value.',
    'exclude_unless' => 'The :attribute field is excluded unless :other is in :values.',
    'exclude_with' => 'The :attribute field is excluded when :values is present.',
    'exclude_without' => 'The :attribute field is excluded when :values is not present.',
    'same' => 'The :attribute and :other must match.',
    'size' => [
        'numeric' => 'The :attribute must be :size.',
        'file' => 'The :attribute must be :size kilobytes.',
        'string' => 'The :attribute must be :size characters.',
        'array' => 'The :attribute must contain :size items.',
    ],
    'starts_with' => 'The :attribute must be start with :values ',
    'string' => 'The :attribute must be a string.',
    'timezone' => 'The :attribute must be a valid zone.',
    'unique' => 'The :attribute has already been taken.',
    'uploaded' => 'The :attribute failed to upload.',
    'uppercase' => 'The :attribute must be uppercase.',
    'url' => 'The :attribute format is invalid.',
    'ulid' => 'The :attribute must be a valid ULID.',
    'uuid' => 'The :attribute is invalid UUID.',
    'max_if' => [
        'numeric' => 'The :attribute may not be greater than :max when :other is :value.',
        'file' => 'The :attribute may not be greater than :max kilobytes when :other is :value.',
        'string' => 'The :attribute may not be greater than :max characters when :other is :value.',
        'array' => 'The :attribute may not have more than :max items when :other is :value.',
    ],
    'min_if' => [
        'numeric' => 'The :attribute must be at least :min when :other is :value.',
        'file' => 'The :attribute must be at least :min kilobytes when :other is :value.',
        'string' => 'The :attribute must be at least :min characters when :other is :value.',
        'array' => 'The :attribute must have at least :min items when :other is :value.',
    ],
    'between_if' => [
        'numeric' => 'The :attribute must be between :min and :max when :other is :value.',
        'file' => 'The :attribute must be between :min and :max kilobytes when :other is :value.',
        'string' => 'The :attribute must be between :min and :max characters when :other is :value.',
        'array' => 'The :attribute must have between :min and :max items when :other is :value.',
    ],
    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Attributes
    |--------------------------------------------------------------------------
    |
    | The following language lines are used to swap attribute place-holders
    | with something more reader friendly such as E-Mail Address instead
    | of "email". This simply helps us make messages a little cleaner.
    |
    */

    'attributes' => [],
    'phone_number' => 'The :attribute must be a valid phone number',
    'telephone_number' => 'The :attribute must be a valid telephone number',

    'chinese_word' => 'The :attribute must contain valid characters(chinese/english character, number, underscore)',
    'sequential_array' => 'The :attribute must be sequential array',
];

<?php

declare(strict_types=1);

namespace App\Providers;

use Hypervel\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
    }

    public function register(): void
    {
    }
}

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Foundation\Http\Middleware\ConvertEmptyStringsToNull as Middleware;

class ConvertEmptyStringsToNull extends Middleware
{
    /**
     * The names of the attributes that should not be transformed to null.
     *
     * @var array<int, string>
     */
    protected array $except = [
    ];
}

<?php

declare(strict_types=1);

namespace App\Models;

use Hypervel\Database\Eloquent\Model as BaseModel;

abstract class Model extends BaseModel
{
    protected ?string $connection = null;
}

<?php

declare(strict_types=1);

use App\Http\Controllers\IndexController;
use Hypervel\Support\Facades\Route;

Route::any('/', [IndexController::class, 'index']);

<?php

declare(strict_types=1);

use Hypervel\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Hypervel\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
}

<?php

declare(strict_types=1);

namespace App\Http\Controllers;

abstract class AbstractController
{
}

<?php

declare(strict_types=1);

namespace App\Events;

class DemoEvent
{
}

class
Handler
extends ExceptionHandler
{
protected array $dontFlash = [
        'current_password',
        'password',
        'password_confirmation',
    ];
public function register () : void {}
}

This code segment functions to: Configure error handling behavior by defining conditions for JSON response rendering based on request path patterns and specifying sensitive data fields excluded from persistent storage.

```php
[TASK_BEGIN]
    public function register(): void
    {
        $this->renderable(function (Throwable $e, Request $request) {
            if ($request->expectsJson()) {
                return response()->json([
                    'message' => 'Server Error',
                ], 500);
            }
        });
    }
[TASK_END]
```