Laravel-excel: [Question] Closure base Row Validation

Created on 16 Feb 2019  路  5Comments  路  Source: Maatwebsite/Laravel-Excel

Prerequisites

Versions

  • PHP version: 7.1
  • Laravel version: 5.7.26
  • Package version: 3.1

Description

Laravel Validation provide closure base rule Validation.
On import excel i have rules() function below:

public function rules(): array{
    //@NOTE: 
    //we use this regex to validate timeformat: "h:i:s A".
    //looks like the validation cannot handle proper rule "date_format:h:i:s A".
    $regexTimeFormat = 'regex:/^([0-9]{1,2})\:([0-9]{1,2})\:([0-9]{1,2})\s\w{2}$/';
    $dateFormat = $this->dateformat;
    $isAllowed = function ($attribute, $value, $fail) use($dateFormat){
        $date = \Carbon\Carbon::createFromFormat($dateFormat, $value);
        if (!allowUpadateOnDate($date)) {
            $fail( str_replace(
                ':value',
                $value,
                trans('my/bauk/attendance/hints.validations.notAllowedByPeriode')
            ));
        }
    };
    $isHoliday = function ($attribute, $value, $fail) use($dateFormat){
        $date = \Carbon\Carbon::createFromFormat($dateFormat, $value);
        $holiday = \App\Libraries\Bauk\Holiday::getHolidayName($date);
        if ($holiday) {
            $fail( str_replace(
                [':value',':name'],
                [$value, $holiday],
                trans('my/bauk/attendance/hints.validations.holiday')
            ));
        }
    };

    return [
        'no' => ['required','numeric'],
        'nip'=> ['required','numeric','exists:bauk.employees,nip'],
        'date' => ['required','date_format:'.$dateFormat, $isAllowed, $isHoliday],
        ['fin'] => ['required',$regexTimeFormat],
        'fout_1' =>['required',$regexTimeFormat],
        'fout_2' =>['nullable',$regexTimeFormat],
        'fout_3' =>['nullable',$regexTimeFormat],

        //  Above is alias for as it always validates in batches
        '*.no' => ['required','numeric'],
        '*.nip'=> ['required','numeric','exists:bauk.employees,nip'],
        '*.date' => ['required','date_format:'.$dateFormat, $isAllowed, $isHoliday],
        '*.fin' => ['required',$regexTimeFormat],
        '*.fout_1' => ['required',$regexTimeFormat],
        '*.fout_2' => ['nullable',$regexTimeFormat],
        '*.fout_3' => ['nullable',$regexTimeFormat],
    ];
}

Try to upload, but i got error below

ErrorException: mb_strpos() expects parameter 1 to be string, object given in file D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Support\Str.php on line 107
Stack trace:
  1. ErrorException->() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Support\Str.php:107
  2. mb_strpos() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Support\Str.php:107
  3. Illuminate\Support\Str->contains() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Validators\RowValidator.php:131
  4. Maatwebsite\Excel\Validators\RowValidator->formatRule() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Validators\RowValidator.php:125
  5. Maatwebsite\Excel\Validators\RowValidator->formatRule() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Validators\RowValidator.php:112
  6. Maatwebsite\Excel\Validators\RowValidator->Maatwebsite\Excel\Validators\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Support\Collection.php:1111
  7. Illuminate\Support\Collection->mapWithKeys() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Validators\RowValidator.php:113
  8. Maatwebsite\Excel\Validators\RowValidator->formatKey() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Validators\RowValidator.php:99
  9. Maatwebsite\Excel\Validators\RowValidator->rules() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Validators\RowValidator.php:36
 10. Maatwebsite\Excel\Validators\RowValidator->validate() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Imports\ModelManager.php:166
 11. Maatwebsite\Excel\Imports\ModelManager->validateRows() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Imports\ModelManager.php:53
 12. Maatwebsite\Excel\Imports\ModelManager->flush() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Imports\ModelImporter.php:57
 13. Maatwebsite\Excel\Imports\ModelImporter->import() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Sheet.php:232
 14. Maatwebsite\Excel\Sheet->import() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Jobs\ReadChunk.php:105
 15. Maatwebsite\Excel\Jobs\ReadChunk->Maatwebsite\Excel\Jobs\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Database\Concerns\ManagesTransactions.php:29
 16. Illuminate\Database\Connection->transaction() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Database\DatabaseManager.php:327
 17. Illuminate\Database\DatabaseManager->__call() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php:237
 18. Illuminate\Support\Facades\Facade->__callStatic() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Jobs\ReadChunk.php:109
 19. Maatwebsite\Excel\Jobs\ReadChunk->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:29
 20. call_user_func_array() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:29
 21. Illuminate\Container\BoundMethod->Illuminate\Container\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:87
 22. Illuminate\Container\BoundMethod->callBoundMethod() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:31
 23. Illuminate\Container\BoundMethod->call() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Container\Container.php:572
 24. Illuminate\Container\Container->call() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php:94
 25. Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:128
 26. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:104
 27. Illuminate\Pipeline\Pipeline->then() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Bus\Dispatcher.php:98
 28. Illuminate\Bus\Dispatcher->dispatchNow() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\ChunkReader.php:58
 29. Maatwebsite\Excel\ChunkReader->Maatwebsite\Excel\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Support\Collection.php:419
 30. Illuminate\Support\Collection->each() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\ChunkReader.php:59
 31. Maatwebsite\Excel\ChunkReader->read() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Reader.php:85
 32. Maatwebsite\Excel\Reader->read() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Excel.php:122
 33. Maatwebsite\Excel\Excel->import() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\maatwebsite\excel\src\Concerns\Importable.php:37
 34. App\Imports\My\Bauk\Attendance\AttendanceByFingersImport->import() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\app\Http\Controllers\My\Bauk\AttendanceController.php:150
 35. App\Http\Controllers\My\Bauk\AttendanceController->upload() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Controller.php:54
 36. call_user_func_array() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Controller.php:54
 37. Illuminate\Routing\Controller->callAction() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php:45
 38. Illuminate\Routing\ControllerDispatcher->dispatch() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Route.php:219
 39. Illuminate\Routing\Route->runController() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Route.php:176
 40. Illuminate\Routing\Route->run() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Router.php:682
 41. Illuminate\Routing\Router->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:30
 42. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\app\Http\Middleware\Service\CheckPermission.php:22
 43. App\Http\Middleware\Service\CheckPermission->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 44. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 45. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\app\Http\Middleware\Service\CheckPermissionContext.php:23
 46. App\Http\Middleware\Service\CheckPermissionContext->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 47. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 48. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\app\Http\Middleware\Service\RequireClientTimezone.php:19
 49. App\Http\Middleware\Service\RequireClientTimezone->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 50. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 51. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\app\Http\Middleware\Service\Auth.php:23
 52. App\Http\Middleware\Service\Auth->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 53. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 54. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Middleware\SubstituteBindings.php:41
 55. Illuminate\Routing\Middleware\SubstituteBindings->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 56. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 57. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php:75
 58. Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 59. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 60. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php:49
 61. Illuminate\View\Middleware\ShareErrorsFromSession->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 62. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 63. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php:63
 64. Illuminate\Session\Middleware\StartSession->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 65. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 66. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php:37
 67. Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 68. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 69. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\EncryptCookies.php:66
 70. Illuminate\Cookie\Middleware\EncryptCookies->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 71. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 72. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:104
 73. Illuminate\Pipeline\Pipeline->then() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Router.php:684
 74. Illuminate\Routing\Router->runRouteWithinStack() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Router.php:659
 75. Illuminate\Routing\Router->runRoute() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Router.php:625
 76. Illuminate\Routing\Router->dispatchToRoute() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Router.php:614
 77. Illuminate\Routing\Router->dispatch() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:176
 78. Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:30
 79. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\app\Http\Middleware\MinifyReponseOutputString.php:11
 80. App\Http\Middleware\MinifyReponseOutputString->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 81. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 82. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\fideloper\proxy\src\TrustProxies.php:57
 83. Fideloper\Proxy\TrustProxies->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 84. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 85. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php:31
 86. Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 87. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 88. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php:31
 89. Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 90. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 91. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php:27
 92. Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 93. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 94. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php:62
 95. Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:163
 96. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
 97. Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:104
 98. Illuminate\Pipeline\Pipeline->then() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:151
 99. Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\system\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:116
100. Illuminate\Foundation\Http\Kernel->handle() D:\CLOUD DRIVE & REPOSITORIES\Git Repositories\jiwa-nala.org\my.jiwa-nala.org\index.php:71

is it posible have closure base rule validation for import?
How to write it properly?

Thanks

question

Most helpful comment

Will be added in next release

All 5 comments

@freezyoff hey, closure validation is currently not supported. Feel free submit a PR to add it.

Sorry, i try to PR but permission denied.

below my fix.
i do test on some possible scenarios in my project, but no phpunit test yet.

hope this help. thx

  1. Maatwebsite\Excel\Validators\RowValidation
  2. add failure line cells, to generate better failure report
  3. add closure condition,
public function validate(array $rows, WithValidation $import)
{
        $rules      = $this->rules($import);
        $messages   = $this->messages($import);
        $attributes = $this->attributes($import);

        try {
            $this->validator->make($rows, $rules, $messages, $attributes)->validate();
        } catch (IlluminateValidationException $e) {
            $failures = [];
            foreach ($e->errors() as $attribute => $messages) {
                $row           = strtok($attribute, '.');
                $attributeName = strtok('');
                $attributeName = $attributes['*.' . $attributeName] ?? $attributeName;

                $failures[] = new Failure(
                    $row,
                    $attributeName,
                    str_replace($attribute, $attributeName, $messages),

            $rows[$row]   //<----- failure line celss
                );
            }

            if ($import instanceof SkipsOnFailure) {
                $import->onFailure(...$failures);
                throw new RowSkippedException(...$failures);
            }

            throw new ValidationException(
                $e,
                $failures
            );
        }
}
private function formatRule($rules)
    {
        if (is_array($rules)) {
            foreach ($rules as $rule) {
                $formatted[] = $this->formatRule($rule);
            }

            return $formatted ?? [];
        }

        //<---- closure condition check
    // check if given $rules is closure.
    // if closure, do nothing. Let Illuminate\Contracts\Validation\Factory handle the rest;
    if (is_object($rules) && is_callable($rules)) return $rules;

        if (Str::contains($rules, 'required_if') && preg_match('/(.*):(.*),(.*)/', $rules, $matches)) {
            $column = Str::startsWith($matches[2], '*.') ? $matches[2] : '*.' . $matches[2];

            return $matches[1] . ':' . $column . ',' . $matches[3];
        }

        return $rules;
    }
  1. Maatwebsite\Excel\Validators
  2. add property $cells
  3. add function cells()
namespace Maatwebsite\Excel\Validators;

use Illuminate\Contracts\Support\Arrayable;

class Failure implements Arrayable
{
    /**
     * @var int
     */
    protected $row;

    /**
     * @var string
     */
    protected $attribute;

    /**
     * @var array
     */
    protected $errors;

    /**
     * @var array
     */
    protected $cells;

    /**
     * @param int    $row
     * @param string $attribute
     * @param array  $errors
     */
    public function __construct(int $row, string $attribute, array $errors, array $cells)
    {
        $this->row       = $row;
        $this->attribute = $attribute;
        $this->errors    = $errors;
        $this->cells     = $cells;
    }

    /**
     * @return int
     */
    public function row(): int
    {
        return $this->row;
    }

    /**
     * @return string
     */
    public function attribute(): string
    {
        return $this->attribute;
    }

    /**
     * @return array
     */
    public function errors(): array
    {
        return $this->errors;
    }

    /**
     * @return array
     */
    public function toArray()
    {
        return collect($this->errors)->map(function ($message) {
            return __('There was an error on row :row. :message', ['row' => $this->row, 'message' => $message]);
        })->all();
    }

    public function cells(): array{
        return $this->cells;
    }
}

Will be added in next release

Wow.. great!!!

Btw, i add cells() function to Failure class.
I'm curious, how to get columns value when failure occurs (without modify it)?

@freezyoff $failure->values()

Was this page helpful?
0 / 5 - 0 ratings

Related issues

adnandogar picture adnandogar  路  32Comments

launtony picture launtony  路  29Comments

ctf0 picture ctf0  路  19Comments

MakamuEvans picture MakamuEvans  路  21Comments

adnandogar picture adnandogar  路  34Comments