robertogallea/laravel-codicefiscale

此包最新版本(2.0.2)的许可证信息不可用。

php/laravel 的 Codice fiscale 验证

2.0.2 2024-07-16 14:04 UTC

README

Laravel Codice Fiscale

laravel-codicefiscale

Author Latest Version on Packagist Laravel >=6.0 Software License Sponsor me! Packagist Downloads

laravel-codicefiscale 是一个用于管理意大利 CodiceFiscale(即税号)的包。该包允许轻松验证和解析 CodiceFiscale。它也适合 Laravel,因为它提供了一种方便的自定义验证器用于请求验证。

Laravel 版本兼容性

重要更新:现在您可以使用非默认的 IstatRemoteCSVList 城市解码器动态加载 ISTAT 的城市代码。

安装

运行以下命令安装此包的最新适用版本

composer require robertogallea/laravel-codicefiscale:^2

Laravel

在您的应用配置中,将服务提供者添加到 $providers 数组 (仅适用于 Laravel 5.4 或以下)

'providers' => [
   ...
   robertogallea\LaravelCodiceFiscale\CodiceFiscaleServiceProvider::class,
],

验证错误消息已翻译为 iten 语言,如果您想添加新语言,请发送 PR。

Lumen

bootstrap/app.php 中,注册服务提供者

$app->register(robertogallea\LaravelCodiceFiscale\CodiceFiscaleServiceProvider::class);

配置

要自定义包配置,您必须将配置文件导出到 config/codicefiscale.php

这可以通过以下命令实现

php artisan vendor:publish --provider="robertogallea\LaravelCodiceFiscale\CodiceFiscaleServiceProvider" --tag="config"

您可以配置以下参数

  • city-decoder:用于解码城市代码的类(见 城市代码解析),默认为 InternationalCitiesStaticList
  • date-format:用于解析出生日期的日期格式,默认为 'Y-m-d'
  • labels:用于 malefemale 人员的标签,默认为 'M''F'

语言文件

您可以通过发布验证翻译来自定义验证消息

php artisan vendor:publish --provider="robertogallea\LaravelCodiceFiscale\CodiceFiscaleServiceProvider" --tag="lang"

验证

要验证 Codice fiscale,请在您的验证规则数组中使用 codice_fiscale 关键字

    public function rules()
    {
        return [
            'codicefiscale' => 'codice_fiscale',
            
            //...
        ];
    }

从版本 1.9.0 开始,您可以对其他表单字段进行 Codice fiscale 验证,以检查是否存在匹配。

您必须指定所有必填字段

  • 名字
  • 姓氏
  • 出生日期
  • 地点
  • 性别

codice_fiscale 规则提供参数。

例如

    public function rules()
    {
        return [
            'codicefiscale' => 'codice_fiscale:first_name=first_name_field,last_name=last_name_field,birthdate=birthdate_field,place=place_field,gender=gender_field',
            'first_name_field' => 'required|string',
            'last_name_field' => 'required|string',
            'birthdate_field' => 'required|date',
            'place_field' => 'required|string',
            'gender_field' => 'required|string|max:1',
            
            //...
        ];
    }

如果提供的 codicefiscale 和从输入字段生成的 codicefiscale 不匹配,则验证失败。

实用 CodiceFiscale 类

Codice fiscale 可以包裹在 robertogallea\LaravelCodiceFiscale\CodiceFiscale 类中以增强其功能。

use robertogallea\LaravelCodiceFiscale\CodiceFiscale;

...
try {
    $cf = new CodiceFiscale();
    $result = $cf->parse('RSSMRA95E05F205Z');
    var_dump($result);
} catch (Exception $exception) {
    echo $exception;
}

在有效 CodiceFiscale 的情况下,它会产生以下结果

[
  "gender" => "M"
  "birth_place" => "F205"
  "birth_place_complete" => "Milano",
  "day" => "05"
  "month" => "05"
  "year" => "1995"
  "birthdate" => Carbon @799632000 {
    date: 1995-05-05 00:00:00.0 UTC (+00:00)
  }
]

如果出错,CodiceFiscale::parse() 会抛出 CodiceFiscaleValidationException,您可以使用 $exception->getCode() 获取定义的常量之一。

  • CodiceFiscaleException::NO_ERROR
  • CodiceFiscaleException::NO_CODE
  • CodiceFiscaleException::WRONG_SIZE
  • CodiceFiscaleException::BAD_CHARACTERS
  • CodiceFiscaleException::BAD_OMOCODIA_CHAR
  • CodiceFiscaleException::WRONG_CODE
  • CodiceFiscaleException::MISSING_CITY_CODE

如果您不想捕获异常,可以使用 CodiceFiscale::tryParse()

use robertogallea\LaravelCodiceFiscale\CodiceFiscale;

...
$cf = new CodiceFiscale();
$result = $cf->tryParse('RSSMRA95E05F205Z');
if ($result) {
    var_dump($cf->asArray());
} else {
    echo $cf->getError();
}

它返回上述相同的值,您可以使用 $cf->isValid() 检查 codicefiscale 是否有效,并使用 $cf->getError() 获取错误。这在 blade 模板中特别有用。

@php($cf = new robertogallea\LaravelCodiceFiscale\CodiceFiscale())
@if($cf->tryParse($codicefiscale))
    <p><i class="fa fa-check" style="color:green"></i>{{$cf->getCodiceFiscale()}}</p>
@else
    <p><i class="fa fa-check" style="color:red"></i>{{$cf->getError()->getMessage()}}</p>
@endif

Codice fiscale 生成

CodiceFiscale 可以用于根据输入值生成 codice fiscale 字符串

$first_name = 'Mario';
$last_name = 'Rossi';
$birth_date = '1995-05-05'; // or Carbon::parse('1995-05-05')
$birth_place = 'F205';      // or 'Milano'
$gender = 'M';

$cf_string = CodiceFiscale::generate($first_name, $last_name, $birth_date, $birth_place, $gender);

Faker 集成

您可以使用提供的 faker 扩展在您的工厂中生成假 codice fiscale

class PersonFactory extends Factory
{
    
    public function definition(): array
    {
        return [
            'first_name' => $firstName = fake()->firstName(),
            'last_name' => $lastName = fake()->lastName(),
            'fiscal_number' => fake()->codiceFiscale(firstName: $firstName, lastName: $lastName),
        ];
    }

注意:您可以提供一些、所有或不需要为生成 codice fiscale 所需的信息(firstNamelastNamebirthDatebirthPlacegender

城市代码解析

解码城市代码有三种策略

  • InternationalCitiesStaticList:意大利城市的静态列表;
  • ItalianCitiesStaticList:国际城市的静态列表;
  • IstatRemoteCSVList:动态列表(从网络加载)的意大利城市,从官方 ISTAT csv 文件加载。请注意,列表被缓存(默认为一天,请参阅配置以进行更改)。
  • CompositeCitiesList:使用配置键 codicefiscale.cities-decoder-list 中的基本 CityDecoderInterface 合并两个 CityDecoderInterface 类的结果(例如 IstatRemoteCSVListInternationalCitiesStaticList)。

默认情况下,该包使用 InternationalCitiesStaticList 类来查找代码对应的城市,反之亦然。但是,您可以使用自己的类来更改使用的策略。

您只需要实现 CityDecoderInterface 及其 getList() 方法。然后,要使用它,只需将实例传递给 CodiceFiscale 类。

例如

class MyCityList implements CityDecoderInterface
{
  public function getList()
  {
    // Implementation
  }
}
...
$cf = new CodiceFiscale(new MyCityList)
...

集成您自己的城市

注意:如果发现缺少城市,请提交一个 PR!

如果您想集成城市列表,可以使用 CompositeCitiesList,通过合并一个提供的解码器和自定义解码器的结果。

例如

// conf/codicefiscale.php

return [
  'city-decoder' => '\robertogallea\LaravelCodiceFiscale\CityCodeDecoders\CompositeCitiesList',

  ...
  
  'cities-decoder-list' => [
        '\robertogallea\LaravelCodiceFiscale\CityCodeDecoders\InternationalCitiesStaticList',
        'YourNamespace\MyCustomList',
    ]

其中 MyCustomList 定义为

...

class MyCustomList implements CityDecoderInterface
{
  public function getList()
  {
    return [
      'XYZ1' => 'My city 1',
      'XYZ2' => 'My city 2',
    ]
  }
}