0

我是 Laravel 的初学者。我了解 CRUD,OOP,创建了一些小应用程序。但是现在我需要将 easypost.com API 集成到 Laravel 项目中。我现在想创建一个简单的邮资计算器。我有一个页面,表格底部和下方是表格,我想显示所有邮资选项和费率等。现在我有 PostageCalculator 控制器并将索引函数放入:

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="submit" 的按钮。我的问题是我知道我需要以某种方式在我的控制器上使用 store () 函数来从表单中获取请求,但是,我不知道如何。

我想从 index() 函数中获取 $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'],

但没有运气。另外,我不知道如何创建和分离从发货和发货到选择表单的值。你能建议吗?非常感谢。,这对我来说很新。

4

3 回答 3

0

为了满足您的需求,您必须将此过程视为应用程序生命周期。

基本上; 您想在页面上显示一个表单,用户需要填写并发布它,您将使用输入来准备您的地址参数并将它们提供给 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结果。您需要$shipment在文件中显示数据resources/views/result.blade.php

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-04T14:04:42.017 回答
0

哦,我终于明白了!我稍后再试一次,会告诉你的,非常感谢

于 2021-08-04T14:24:27.417 回答
0

我做了 session::put 请求并使用这个会话将数据传递给 index()。此解决方案有效,如果您有更好的东西,请告诉我,感谢战利品

于 2021-08-05T16:21:37.920 回答