Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Question] Closure base Row Validation #2058

Closed
freezyoff opened this issue Feb 16, 2019 · 5 comments
Closed

[Question] Closure base Row Validation #2058

freezyoff opened this issue Feb 16, 2019 · 5 comments
Labels

Comments

@freezyoff
Copy link

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

@freezyoff freezyoff changed the title Closure base Row Validation [Question] Closure base Row Validation Feb 17, 2019
@patrickbrouwers
Copy link
Member

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

@freezyoff
Copy link
Author

freezyoff commented Feb 26, 2019

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
  • add failure line cells, to generate better failure report
  • 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
  • add property $cells
  • 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;
	}
}

@patrickbrouwers
Copy link
Member

Will be added in next release

@freezyoff
Copy link
Author

Wow.. great!!!

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

@patrickbrouwers
Copy link
Member

@freezyoff $failure->values()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants