簡體   English   中英

Laravel:如何提交表格並保持相同的觀點?

[英]Laravel: How do I submit a form and stay in the same view?

我在Laravel中有一個已經合並了foreach循環的視圖。 頁面底部是一個小表格。 現在,我想發送此表單以將數據保存到數據庫中。

同時,我想保持相同的觀點。 如果我在表單中輸入同一頁面,則會收到錯誤消息。 如果我想通過控制器返回視圖,我也會收到錯誤消息。

在此錯誤中,先前由另一個控制器傳遞的循環中數據的輸出將不再起作用。 - 我能做什么?

未定義的變量:數據(視圖:/srv/users/smartfinance/apps/smartfinance/public/laravel/resources/views/home.blade.php)

  <?php $__currentLoopData = $data; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $d): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> 

希望您能理解我的問題,並給我提示如何解決。

這是兩個控制器:

class checkDataController extends Controller
{
    public function data()
    {
        $data = DB::table('test')->where('booking_date', '=', $today)->get();
        return view('home', compact("data"));
    }
}

class AddContractController extends Controller
{
    public function addNewData(Request $request)
    {
        $bez = $request->bez;
        return view('home');
    }
}

您的錯誤是您嘗試通過兩種不同的控制器方法顯示相同的視圖。 通常,一個控制器只使用一個視圖。 其他方法可以重定向到此方法,以便(重新)顯示相同的視圖。 這樣,僅在一個地方就需要為視圖檢索數據的邏輯。

class CheckDataController extends Controller
{
    // route 'check.data'
    public function data()
    {
        $data = DB::table('test')->where('booking_date', '=', $today)->get();
        return view('home', compact("data"));
    }
}

class AddContractController extends Controller
{
    // route 'contract.create'
    public function addNewData(Request $request)
    {
        Contract::create($request->input()); // unsafe, only for demonstration...

        return redirect()->route('check.data');
    }
}

如您所見,我們返回的是redirect()->route('check.data') ,而不是return view('home') redirect()->route('check.data') 這會將用戶重定向到具有已定義路由的其他控制器。 當然,這意味着您實際上是在一個用戶動作中執行兩個控制器方法,但這是常見的做法。

有關重定向的更多信息,請參見官方文檔

給您的建議我的朋友不要通過post方法返回視圖。

我想addNewData()方法是一種來自發布路由的方法。 因此,當您在發布方法后返回視圖時,不會提供頁面數據。 因此laravel拋出錯誤並抱怨缺少變量。 因此,您要做的就是重定向到查看該頁面的路由。 因此,您的方法將如下所示:

public function addNewData(Request $request)
    {
        $bez = $request->bez;
        return redirect('YOUR ROUTE TO VIEW THE PAGE (URL)');
    }

通常,這是通過重定向回您提交的同一頁面來完成的。 這是您的控制器中的外觀:

public function addNewData(Request $request)
{
    $bez = $request->bez;
    return back();
}

為了獲得更好的用戶體驗,還應該使用以下形式向視圖添加消息:

@if(session('status'))
    <div class="alert alert-success" role="alert">
        {{ session('status') }}
    </div>
@endif

並對您的控制器做一個小改動:

return back()->with('status', "Successfully submitted {$bez}!");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM