@piljac1 I have done dd(request()->all()) before and without the validator stuff. Everything appears to be there.
Some background: purpose is to provide a form to enable the user to generate a PDF report of data for state legislators. In form 1, user selects the type of report and for which political district. That posts to the Edit form, where the user can edit the data. When done, the Edit form posts to the generate method, which should a) validate the post data, then b) generate a PDF with Spatie/Browsershot, c) save it, and then d) take the user to another page to view and download the PDF.
The whole process works fine in a standard Laravel (non-inertia) environment, relying largely on blade/PHP and some Vue js code. I am in the process of migrating the entire application (which involves much more than this ) to Inertia and Vue 3. I think Inertia is playing a role in the problem I'm seeing, but at the moment I'm stuck.
Request data:
array:25 [▼ // app/Http/Controllers/ReportController.php:383
"district" => 7
"ordinal" => "th"
"report_title" => "Assembly District"
"report_file_name" => "uw-impact-assembly-district-7-2022.pdf"
"report_type" => "District"
"current_year" => 2022
"fy" => "2021–2022"
"students" => 103
"employees" => 17
"alumni" => 630
"mds" => 18
"nurses" => 25
"pharms" => 22
"engineers" => 40
"vets" => 4
"trans_total" => 577020.4
"exec_dev_companies_total" => 4
"med_companies_total" => 2
"selected" => array:6 [▶]
"vet_clients" => 17
"includeVetClients" => true
"loan_aid" => 500
"financial_aid" => 806371
"promises" => "39"
"extension" => 0
]
Routes (just the ones behind auth; the reports routs are the ones involved here):
function () {
Route::middleware(['wi.autologin'])->group(function () {
Route::resource('/user', UserController::class);
Route::resource('/project', ProjectController::class);
Route::resource('/site', SiteController::class);
Route::patch('/project/confirm/{project}', [
ProjectController::class,
'confirm',
])->name('project.confirm');
Route::patch('/project/archive/{project}', [
ProjectController::class,
'archive',
])->name('project.archive');
Route::patch('/project/approve-edits/{project}', [
ProjectController::class,
'approveEdits',
])->name('project.approve-edits');
Route::get('/admin/panel', AdminPanelController::class)
->middleware('wi.admins-only')
->name('admin.dashboard');
Route::get('/projects/retired', [ProjectController::class, 'retired'])
->middleware('wi.admins-only')
->name('project.retired');
Route::get('/profile', [ProfileController::class, 'edit'])->name(
'profile.edit'
);
Route::patch('/profile', [ProfileController::class, 'update'])->name(
'profile.update'
);
Route::delete('/profile', [ProfileController::class, 'destroy'])->name(
'profile.destroy'
);
Route::middleware(['wi.reports'])->group(function () {
Route::get('report', [ReportController::class, 'index'])->name('report.index');
Route::post('report/edit', [ReportController::class, 'edit'])->name('report.edit');
Route::post('report/generate', [ReportController::class, 'generate',])->name('report.generate');
Route::get('report/pdf', [ReportController::class, 'showPdf'])->name('report.pdf');
Route::get('report/success', [ReportController::class, 'reportSuccess'])->name('report.success');
});
});
The Vue component (just the <script setup> section, minus some irrelevant code for readability. The <template> section is s really, really long form)
<script setup>
import { reactive, computed } from 'vue';
import { Head, usePage, useForm } from '@inertiajs/vue3';
import AppLayout from '@/Layouts/AppLayout.vue';
import BaseCheckbox from '@/components/BaseCheckbox.vue';
const { props } = usePage();
const form = useForm({
district: props.district,
ordinal: props.ordinal,
report_title: props.report_title,
report_file_name: props.report_name,
report_type: props.report_type,
current_year: props.current_year,
fy: props.fy,
students: props.students,
employees: props.employees,
alumni: props.alumni,
mds: props.mds,
nurses: props.nurses,
pharms: props.pharms,
engineers: props.engineers,
vets: props.vets,
trans_total: props.trans_total,
exec_dev_companies_total: props.exec_dev_companies.length,
med_companies_total: props.med_companies.length,
selected: {
vendors: [],
cals_interns: [],
med_companies: [],
cheesemakers: [],
food_science: [],
exec_dev_companies: [],
},
vet_clients: props.vet_clients,
includeVetClients: false,
loan_aid: props.loan_aid,
financial_aid: props.financial_aid,
promises: props.promises,
extension: props.extension
});
const submit = () => {
// if (form.processing) return;
// if (!form.isDirty) alert('The form contains no changes');
form.post(
route('auth.report.generate'), {
onSuccess: () => console.log('success'),
onError: () => console.log('error'),
onInvalid: () => console.log('invalid'),
onStart: () => console.log('start')
}
);
};
</script>
For the validation, I am using a form request class:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ReportGenerateRequest extends FormRequest
{
public function rules(): array
{
return [
'report_title' => ['required'],
'report_file_name' => ['required'],
'report_type' => ['required'],
'district' => ['required'],
'current_year' => ['required'],
'fy' => ['required'],
'trans_total' => ['required'],
'alumni' => ['required'],
'employees' => ['required'],
'vets' => ['required'],
'students' => ['required'],
'ordinal' => ['required'],
'mds' => ['required'],
'nurses' => ['required'],
'pharms' => ['required'],
'engineers' => ['required'],
'exec_dev_companies_total' => ['required'],
'med_companies_total' => ['required'],
'vet_clients' => ['required'],
'includeVetClients' => ['required'],
'loan_aid' => ['required'],
'financial_aid' => ['required'],
'promises' => ['required'],
'extension' => ['required'],
'selected' => ['required']
];
}
public function authorize(): bool
{
return true;
}
}
The controller generate method (most recent iteration). Earlier I tried doing a redirect and flashing a success message. I thought that it actually worked once, but I can't recall whether the validation was commented out or not.:
public function generate(ReportGenerateRequest $request)
{
$data = [];
$data['major_vendors'] = $request->input('selected.vendors');
$data['exec_dev_companies'] = $request->input('selected.exec_dev_companies');
$data['food_science'] = $request->input('selected.food_science');
$data['cals_interns'] = $request->input('selected.cals_interns');
$data['cheesemakers'] = $request->input('selected.cheesemakers');
$data['med_companies'] = $request->input('selected.med_companies');
$data['vet_clients'] = $request->input('vet_clients');
$data['report_title'] = $request->input('report_title');
//dd($data);
$data['report_type'] = $request->input('report_type');
$data['district'] = $request->input('district');
$data['current_year'] = $data['year'] = $request->input('current_year');
$data['ordinal'] = $request->input('ordinal');
$data['fy'] = $request->input('fy');
$data['trans_total'] = $request->input('trans_total');
$data['alumni'] = $request->input('alumni');
$data['employees'] = $request->input('employees');
$data['students'] = $request->input('students');
$data['mds'] = $request->input('mds');
$data['nurses'] = $request->input('nurses');
$data['pharms'] = $request->input('pharms');
$data['engineers'] = $request->input('engineers');
$data['vets'] = $request->input('vets');
$data['includeVetClients'] = $request->input('includeVetClients');
$data['vet_clients'] = $request->input('vet_clients');
//$data['total'] = 0;
$data['financial_aid'] = $request->input('financial_aid');
$data['promises'] = $request->input('promises');
$data['loan_aid'] = $request->input('loan_aid');
$data['extension'] = $request->input('extension');
$data['execdev_companies_total'] = $request->input('execdev_companies_total');
$data['med_companies_total'] = $request->input('med_companies_total');
$report_name = $request->input('report_file_name');
$html = view('reports.pdf-report', $data)->render();
$pdfPath = storage_path('app/public/report.pdf');
Browsershot::html($html)
->setNodeBinary(config('constants.node_bin').'node')
->setNpmBinary(config('constants.node_bin').'npm')
->showBackground()
->setOption('newHeadless', true)
->savePdf($pdfPath);
return inertia('Reports/Success', [
'pdfUrl' => route('auth.report.pdf'),
'message' =>session('message')
]);
//return redirect()->route('auth.report.success')->with('message', 'Report generated successfully.');
}