robertogallea / laravel-codicefiscale

Codice fiscale validation for php/laravel
MIT License
42 stars 16 forks source link

Problema con CompositeCitiesList #29

Closed marco987 closed 3 years ago

marco987 commented 3 years ago

Salve. Sto provando ad utilizzare CompositeCitiesList. In config\codicefiscale.php ho configurato in questo modo:

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

'cities-decoder-list' => [
    '\robertogallea\LaravelCodiceFiscale\CityCodeDecoders\ISTATRemoteCSVList',
    '\robertogallea\LaravelCodiceFiscale\CityCodeDecoders\InternationalCitiesStaticList',
],

Poi in src\CodiceFiscale.php ho inserito use robertogallea\LaravelCodiceFiscale\CityCodeDecoders\CompositeCitiesList; e nel costruttore ho sostituito questo:

$this->cityDecoder = isset($cityDecoder) ? $cityDecoder : new InternationalCitiesStaticList();

con questo:

`$this->cityDecoder = isset($cityDecoder) ? $cityDecoder : new CompositeCitiesList();`

Quindi nel controller ho:

use robertogallea\LaravelCodiceFiscale\CodiceFiscale;
use robertogallea\LaravelCodiceFiscale\CityCodeDecoders\CompositeCitiesList;

$cf = new CodiceFiscale(new CompositeCitiesList());
$result = $cf->parse('UnCodiceFiscaleCorretto');
print_r($cf->getError());
print_r($result);

E mi viene restituita pagina bianca... Dove sbaglio?

robertogallea commented 3 years ago

Salve Marco, Credo che tu lo stia utilizzando nel modo sbagliato. Fra l'altro mi sembra che tu stia modificando i sorgenti, cosa che non andrebbe fatta.

Puoi provare nel seguente modo:

// config/codicefiscale.php

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

    // The following parameters are used when using IstatRemoveCSVList city decoder class
    // The url where the CSV provided by ISTAT is served (should never change)
    'istat-csv-url' => env('CF_ISTAT_CSV_URL', 'https://www.istat.it/storage/codici-unita-amministrative/Elenco-comuni-italiani.csv'),

    // Cache duration (in seconds) for storing the list downloaded from the CSV
    'cache-duration' => env('CF_CACHE_DURATION', 60 * 60 * 24),

    // When using CompositeCitiesList, you may specify the CityDecoders to merge the results from
    'cities-decoder-list' => [
        '\robertogallea\LaravelCodiceFiscale\CityCodeDecoders\ISTATRemoteCSVList',
        '\robertogallea\LaravelCodiceFiscale\CityCodeDecoders\InternationalCitiesStaticList',
    ],
];

e poi dove vuoi utilizzare la classe, es: controller:

$cf = new robertogallea\LaravelCodiceFiscale\CodiceFiscale(new robertogallea\LaravelCodiceFiscale\CityCodeDecoders\CompositeCitiesList());
$result = $cf->parse('UnCodiceFiscaleCorretto');
print_r($cf->getError());
print_r($result);
marco987 commented 3 years ago

Grazie per la risposta Roberto. Ho ripristinato i file sorgente. Il problema rimane. Ecco cosa mi stampa con dd($cf); :

robertogallea\LaravelCodiceFiscale\CodiceFiscale {#1305 ▼
  #cityDecoder: robertogallea\LaravelCodiceFiscale\CityCodeDecoders\CompositeCitiesList {#5873}
  -cf: null
  -isValid: null
  -gender: null
  -birthPlace: null
  -day: null
  -month: null
  -year: null
  -error: null
  -tabDecodeOmocodia: array:26 [▶]
  -tabReplacementOmocodia: array:7 [▶]
  -tabDecodeMonths: array:12 [▶]
  -checks: array:5 [▶]
}

E mi sembra corretto fin qui, mi sembra correttamente istanziata la classe. Ma dd($result); mi restituisce pagina bianca...

robertogallea commented 3 years ago

$result dovrebbe contenere le informazioni spezzate del cf.

Dentro il controller puoi anche usare il service container ed in questo modo semplificare, dato che non devi costruire gli oggetti (occhio che in questo caso il decoder lo prende da configurazione):

Route::get('/', function (\robertogallea\LaravelCodiceFiscale\CodiceFiscale $cf) {
    try {
        $result = $cf->parse('UnCodiceFiscaleCorretto');
        dd($result);
    } catch (\robertogallea\LaravelCodiceFiscale\Exceptions\CodiceFiscaleValidationException $exception) {
        dd($exception);
    }
});

Prova questo snippet e fammi sapere.

marco987 commented 3 years ago

Niente, pagina bianca. PS. Sto usando Laravel 8, c'è qualche incompatibilità?

robertogallea commented 3 years ago

No, nessuna incompatibilità. Anche io ho provato su un progetto nuovo con L8. Prova a fare queste verifiche:

marco987 commented 3 years ago

Quando in config\codicefiscale.php metto il seguente decoder 'city-decoder' => '\robertogallea\LaravelCodiceFiscale\CityCodeDecoders\InternationalCitiesStaticList', funziona tutto perfettamente! Niente da segnalare nei log. Io già uso questo pacchetto in altri miei progetti, ma senza il decoder CompositeCitiesList ... Temo che il problema nasca da lì

robertogallea commented 3 years ago

ed invece che mi dici di \robertogallea\LaravelCodiceFiscale\CityCodeDecoders\ISTATRemoteCSVList? Lo hai provato a solo? Essendo che usa chiamate http, il file system (per salvarae il file csv temporaneo) e la cache, può darsi che sulla tua macchina ci siano problemi legati a questi tre elementi?

robertogallea commented 3 years ago

Se vuoi condividimi il progetto o un progetto di base in cui replichi il problema.

marco987 commented 3 years ago

ISTATRemoteCSVList da solo non funziona, mi correggo. Provo a impostare il salvataggio del csv ogni secondo, tanto per fare un test.

robertogallea commented 3 years ago

Infatti come immaginavo il problema sta lì, verifica anche che la cache (su disco o su altro device che usi) funzioni.

P.S. ricordavo male, il file csv non viene salvato su un file temporaneo.

marco987 commented 3 years ago

No, niente, nemmeno impostando la cache a 1 secondo.

robertogallea commented 3 years ago

Prova a condividermi il progetto se ti va, o fai qualche prova su un progetto vuoto.

robertogallea commented 3 years ago

Se vuoi, giusto per capire se il problema è la cache, modifica il sorgente di ISTATRemoteCSVList, eliminando la cache:

    public static function getList()
    {
            $client = new Client();
            $response = $client->request('GET', config('codicefiscale.istat-csv-url'));

            $body = iconv('ISO-8859-1', 'UTF-8', $response->getBody());

            $body = self::str_replace_times("\n", '', $body, 2);

            $data = self::getCsv($body);
            $list = self::csvToList($data);

            return $list;
    }

E poi, giusto per scrupolo: config('codicefiscale.istat-csv-url') è valorizzato, giusto?

marco987 commented 3 years ago

'istat-csv-url' => env('CF_ISTAT_CSV_URL', 'https://www.istat.it/storage/codici-unita-amministrative/Elenco-comuni-italiani.csv'),

Non ha funzionato: dd($response); mi dà pagina bianca...

robertogallea commented 3 years ago

Prova a fare un po' di dump all'interno di quello stesso metodo... Lo farei io, ma non riesco a riprodurre il problema.

marco987 commented 3 years ago

dd($client);

GuzzleHttp\Client {#5869 ▼
  -config: array:8 [▼
    "handler" => GuzzleHttp\HandlerStack {#5872 ▼
      -handler: Closure(RequestInterface $request, array $options): PromiseInterface {#5863 ▶}
      -stack: array:4 [▶]
      -cached: null
    }
    "allow_redirects" => array:5 [▼
      "max" => 5
      "protocols" => array:2 [▶]
      "strict" => false
      "referer" => false
      "track_redirects" => false
    ]
    "http_errors" => true
    "decode_content" => true
    "verify" => true
    "cookies" => false
    "idn_conversion" => false
    "headers" => array:1 [▼
      "User-Agent" => "GuzzleHttp/7"
    ]
  ]
}

Dopodiché ogni dump è una pagina bianca... Non prosegue lo script proprio. Preciso che con in locale, Wampserver64 su Windows10

robertogallea commented 3 years ago

Non che è sei in qualche rete con limiti di accesso? Hai provato a scaricare da un browser il file all'indirizzo https://www.istat.it/storage/codici-unita-amministrative/Elenco-comuni-italiani.csv ?

Alla cieca non saprei cos'altro suggerirti...

marco987 commented 3 years ago

Il download funziona

robertogallea commented 3 years ago

Prova a fare anche questo:

use Illuminate\Support\Facades\Http;

$response = Http::get('http://google.com');
dd($response->body());

vedi se questa va.

robertogallea commented 3 years ago

Vedi se questo ti aiuta https://stackoverflow.com/questions/29822686/curl-error-60-ssl-certificate-unable-to-get-local-issuer-certificate

marco987 commented 3 years ago

Adesso sì! Funziona tutto 👍

(Avendo server WAMP la risposta l'ho presa qui https://stackoverflow.com/questions/42094842/curl-error-60-ssl-certificate-in-laravel-5-4 )

Grazie Roberto!

robertogallea commented 3 years ago

Ottimo! Allora chiudo l'issue!