我在Laravel还是个初学者。我理解CRUD,OOP,创建了一些小应用程序。但现在我需要将easypost.com应用程序接口集成到Laravel项目中。现在我想创建一个简单的邮资计算器。我有一个页面,其中表格在底部和下面的表格,我想显示所有邮资选项与费率等。现在我有PostageCalculator控制器和the到索引函数这:
public function index()
{
\EasyPost\EasyPost::setApiKey(env('EASYPOST_API'));
$shipment = \EasyPost\Shipment::create(array(
"to_address" => array(
'name' => 'Dr. Steve Brule',
'street1' => '3993 Glen Meadow Dr',
'city' => 'Norcross',
'state' => 'GA',
'zip' => '30092',
'country' => 'US',
'phone' => '3331114444',
'email' => 'dr_steve_brule@gmail.com'
),
"from_address" => array(
'name' => 'EasyPost',
'street1' => '417 Montgomery Street',
'street2' => '5th Floor',
'city' => 'Brno',
'state' => 'CZ',
'zip' => '60200',
'country' => 'CZ',
'phone' => '3331114444',
'email' => 'support@easypost.com'
),
"parcel" => array(
"length" => 1,
"width" => 1,
"height" => 1,
"weight" => 352.74
)
));
return view ('pages.rates', [
'shipment' => $shipment
]);
}因此,我将$shipment变量发送到rates.blade.php视图,并使用foreach来显示我需要的所有信息。但我也有一个表单,我想在其中选择例如发货和交付国家,并允许用户键入他们的重量,尺寸等,所以我创建了这个表单
<form action="/rates" method="post">
@csrf
@method('post')
{{-- Zeme odeslani --}}
<div class="container">
<div class="row">
<div class="col">
<div class="form-group">
<label>Země odeslání</label>
@error('text')
<div class="alert alert-danger" role="alert">{{$message}}
</div>
@enderror
<select class="form-select" aria-label="Default select example">
<option selected>Vyberte zemi</option>
<option value="CZ" name="CZ">Česká republika</option>
<option value="US" name="US">USA</option>
<option value="SK" name="SK">Slovensko</option>
</select>
</div>
</div>
<div class="col">
<div class="form-group">
<label>Země doručení</label>
@error('text')
<div class="alert alert-danger" role="alert">{{$message}}
</div>
@enderror
<select class="form-select" aria-label="Default select example">
<option selected>Vyberte zemi</option>
<option value="CZ" name="CZ">Česká republika</option>
<option value="US" name="US">USA</option>
<option value="SK" name="SK">Slovensko</option>
</select>
</div>
</div>
</div>
</div>
<div class="container">
<div class="form-group">
<label>Rozměry:</label>
@error('text')
<div class="alert alert-danger" role="alert">{{$message}}
</div>
@enderror
<div class="row">
<div class="col"><input type="text" class="form-control" name="weight" placeholder="Váha (kg)" ></div>
<div class="col"><input type="text" class="form-control" name="width" placeholder="Šířka (cm)" ></div>
<div class="col"><input type="text" class="form-control" name="height" placeholder="Výška (cm)" ></div>
<div class="col"><input type="text" class="form-control" name="`lenght`" placeholder="Délka (cm)" ></div>
</div>
<br>
< button type="submit" class="btn btn-primary">Spočítat cenu</button>
</form>
</div>和带有type=“提交”的按钮。我的问题是,我知道我需要以某种方式使用我的控制器的store ()函数来从表单中获取请求,但是,我不知道怎么做。
我想从索引()函数获取$shipment请求,但我在刀片上使用了foreach,它不知道变量$shipment。而且我也不知道如何使用2个选项表单。如果我选择了
<select class="form-select" aria-label="Default select example">
<option selected>Vyberte zemi</option>
<option value="CZ" name="CZ">Česká republika</option>
<option value="US" name="US">USA</option>
<option value="SK" name="SK">Slovensko</option>
</select>一个选择表单用于发货地址发件人,第二个表单用于发货地址。如何从表单中获取请求,并在同一个包计算器页面上显示来自EasyPost的结果?尝试了一些类似的东西:
'country' => $request->input['formname'],但没那么走运。此外,我不知道如何为发货人和收货人选择表单创建和分隔值。你能给点建议吗?非常感谢,这对我来说是很新鲜的。
发布于 2021-08-04 14:04:42
为了满足您的需求,您必须将此过程视为一个应用程序生命周期。
基本上,你想在页面上显示一个表单,用户需要填写并发布它,你将使用输入来准备你的地址参数并将它们提供给Easypost api,当你从api获得响应时,你将把它传递给一个视图以在屏幕上显示结果。
当我检查您的表单刀片时,您的选择字段上没有任何name属性。你需要这样的东西;
<select name="from_country" class="form-select" aria-label="Default select example">
<option selected>Vyberte zemi</option>
<option value="CZ" name="CZ">Česká republika</option>
<option value="US" name="US">USA</option>
<option value="SK" name="SK">Slovensko</option>
</select>和另一种;
<select name="to_country" class="form-select" aria-label="Default select example">
<option selected>Vyberte zemi</option>
<option value="CZ" name="CZ">Česká republika</option>
<option value="US" name="US">USA</option>
<option value="SK" name="SK">Slovensko</option>
</select>现在您可以从请求中选择访问此字段的选项;
public function show_result(Request $request)
{
$from_country = $request->from_country;
// OR
$from_country = $request->input('from_country');
}您可以在此处找到$request->input(...)的其他用法示例:https://laravel.com/docs/8.x/requests#retrieving-an-input-value
因此,您需要创建2条路由;1条用于显示表单,1条用于流程表单和显示结果。
在routes/web.php文件中;
Route::get('form', [\App\Http\Controllers\PostageCalculator::class, 'form']); // to show form
Route::post('result', [\App\Http\Controllers\PostageCalculator::class, 'result']); // to show results在app/Http/Controllers/PostageCalculator.php文件中;
// define your methods in your Controller class
public function form()
{
$data = []; // prepare any daha if you need anything on your form but as I see you don't need any
return view('form', $data);
}
public function result(Request $request)
{
// if you need any validation for form fields you can use $request->validate([...]);
// you can access all posted input fields which specified with a name
$to_address = array(
'name' => $request->input('to_address_name'),
'street1' => $request->input('to_address_street1'),
'city' => $request->input('to_address_city'),
'state' => $request->input('to_address_state'),
'zip' => $request->input('to_address_zip'),
'country' => $request->input('to_address_country'),
'phone' => $request->input('to_address_phone'),
'email' => $request->input('to_address_email')
);
$from_address = array(
'name' => $request->('from_address_name'),
'street1' => $request->('from_address_street1'),
'city' => $request->('from_address_city'),
'state' => $request->('from_address_state'),
'zip' => $request->('from_address_zip'),
'country' => $request->('from_address_country'),
'phone' => $request->('from_address_phone'),
'email' => $request->('from_address_email')
);
$parcel = array(
"length" => $request->input('length'),
"width" => $request->input('width'),
"height" => $request->input('height'),
"weight" => $request->input('weight'),
);
\EasyPost\EasyPost::setApiKey(env('EASYPOST_API')); // you should use config('services.easypost.api_key') instead of env(...)
$shipment = \EasyPost\Shipment::create([$to_address, $from_address, $parcel]);
return view('result', compact('shipment'));
}要使用$request->input('name')访问输入数据,需要为所有字段指定唯一的名称。
在resources/views/form.blade.php中
<form action="{{ url('result') }}" method="post">
@csrf
From address:<br>
<input name="from_address_name" placeholder="from_address_name"><br>
<input name="from_address_street1" placeholder="from_address_street1"><br>
<input name="from_address_city" placeholder="from_address_city"><br>
<input name="from_address_state" placeholder="from_address_state"><br>
<input name="from_address_zip" placeholder="from_address_zip"><br>
<select name="from_address_country" class="form-select">
<option selected>Select Country</option>
<option value="CZ" name="CZ">Česká republika</option>
<option value="US" name="US">USA</option>
<option value="SK" name="SK">Slovensko</option>
</select><br>
<input name="from_address_phone" placeholder="from_address_phone"><br>
<input name="from_address_email" placeholder="from_address_email">
<hr>
To address:
From address:<br>
<input name="to_address_name" placeholder="to_address_name"><br>
<input name="to_address_street1" placeholder="to_address_street1"><br>
<input name="to_address_city" placeholder="to_address_city"><br>
<input name="to_address_state" placeholder="to_address_state"><br>
<input name="to_address_zip" placeholder="to_address_zip"><br>
<select name="to_address_country" class="form-select">
<option selected>Select Country</option>
<option value="CZ" name="CZ">Česká republika</option>
<option value="US" name="US">USA</option>
<option value="SK" name="SK">Slovensko</option>
</select><br>
<input name="to_address_phone" placeholder="to_address_phone"><br>
<input name="to_address_email" placeholder="to_address_email">
<hr>
Parcel:
<input type="text" class="form-control" name="weight" placeholder="Váha (kg)" ><br>
<input type="text" class="form-control" name="width" placeholder="Šířka (cm)" ><br>
<input type="text" class="form-control" name="height" placeholder="Výška (cm)" ><br>
<input type="text" class="form-control" name="`lenght`" placeholder="Délka (cm)" ><br>
<button type="submit">Show Results</button>
</form>(我在这里没有使用任何类/样式,但每个输入字段都有一个名称)
现在您的/form路由可以工作了,并显示了一个表单。然后将其发布到/result路由,以捕获输入字段并计算$shipment结果。您需要在resources/views/result.blade.php文件上显示$shipment数据。
在resources/views/result.blade.php文件中;
<h1>Calculation Result</h1>
@foreach($shipment->rates as $rate)
{{ $rate->service }} <br>
{{ $rate->carrier }} <br>
{{ $rate->rate }}
<hr>
@endforeach实际上,我以前没有使用过easypost api,但我查看了文档:https://www.easypost.com/docs/api/php#shipments-create-codesample
我想这就是全部,你需要检查和编辑我的答案中的代码样本。
发布于 2021-08-04 14:24:27
哦,我终于明白了!我稍后会再试一次,我会让你知道的,谢谢。
发布于 2021-08-05 16:21:38
我执行了session::put请求,并使用这个session for将数据传递给index()。这个解决方案行得通,如果你有更好的办法,请告诉我,谢谢。
https://stackoverflow.com/questions/68651936
复制相似问题