如何在会话 Laravel 中存储输入

问题描述 投票:0回答:3

我是 Laravel 的新手,我在这里尝试将我的输入表单发布到会话中,但它不起作用,我收到此错误,没有任何消息:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

我什么也没找到,在这里我分享一些我的代码。

我的控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Category;
use \App\Product;

class ShopController extends Controller
{
    public function index()
    {
        $categories = Category::with('products')->get();
        return view('shop.index', compact('categories'));
    }

    public function category($id)
    {
        $products = Category::find($id)->products;
        return view('shop.1', compact('products'));
    }

    public function addToShoppingCart(Request $request)
    {
        $request->session()->put('cart', 'id');
        $request->session()->put('cart', 'number');

        $request->session()->flash('status', 'Product is toegevoegd!');
        return redirect()->back();
    }
}

我的看法:

@extends('layouts.app')

@section('content')
    @if(Session::has('id', 'number'))
        <div class="alert alert-success">
            {{Session::get('id', 'number')}}
        </div>
    @endif
    @foreach ($products as $product)
        <ul>
            <li>{{ $product->name }}</li>
            <li>{{ $product->description }}</li>
            <li>{{ $product->price }}</li>
            <li>{{ $product->amount }}</li>
        </ul>
        <form method="post" action="{{url('categories\{id}')}}">
            @csrf
            <div class="col-md-4">
                <label for="number">Aantal:</label>
                <input type="number" name="number">

                <label for="id">Id:</label>
                <input type="text" id="id" name="id" value= {{$product->id}}>

                <button type="submit" class="btn btn-success">Add product</button>
            </div>
        </form>
    @endforeach
    {{var_dump(Session::get('cart'))}}

@endsection

我的路线:

Route::get('/shop', 'Shopcontroller@index')->name('shop');
Route::get('/categories/{id}', 'ShopController@category');
Route::get('/cart/{id}', 'ShopController@addToShoppingCart');

我希望有人可以帮助我解决我的问题,将输入放入 laravel 的会话中。

php laravel forms session
3个回答
5
投票

您正在尝试使用“获取”路线“发布”。您应该将

Route::get
更改为
Route::post


0
投票

首先,我建议你使用

route()
方法。
url()
方法没有任何问题,但我只是使用
route()
方法。

那么让我们来解决您的问题吧!

1. 为你的路由添加名称并将 ROUTE 设置为 POST 而不是 GET

Route::get('/shop', 'Shopcontroller@index')->name('shop');
Route::post('/categories/{id}', 'ShopController@category')->name('category');
Route::get('/cart/{id}', 'ShopController@addToShoppingCart')->name('cart.add');

2. 将您的路线作为操作传递到表单

action="{{route('category',['id' => 'your_category_id_here'])}}

3.添加
use Session;

您的控制器缺少

use Session;
语句,请将其添加到控制器页面顶部,以便您能够使用会话。


0
投票

兄弟你的代码根本不正确。我也遇到了一些类似的问题,但后来我读到了 Laravel 中的会话,全局会话访问和使用 session()->put($key) 是不同的,可能会给你带来问题,总是使用 dd($statements) 进行调试以了解什么你的代码输出确实是。检查此代码并仔细阅读:

在 web.php 中:

//显示购物车

路线::get('/cart', [产品::class, 'showCart']);

//更改购物车页面中产品的数量

路线::post('/cart/{id}', [产品::class, 'changeQuantity']);

//从购物车中删除产品

Route::delete('/cart/{id}', [产品::class, 'removeFromCart']);

//加入购物车

Route::post('/singleProduct/{id}', [产品::class, 'addToCart']);

在产品控制器中:

//加入购物车

public function addToCart(Request $request, $id)
{

    if (auth()->user()) {

        $products = product::find($id);
        $allColumns = $products->getAttributes();
        $getColumn = Session::get('quantity-' . $allColumns['id']);

        if (!$getColumn) {
            session()->put($request->input());
            return back()->with('message', 'Product added to cart');
        } else {

            return back()->with('message', 'Product already exists in cart');
        }
    } else {
        return redirect('/login');
    }
}

//show cart
public function showCart()
{
    if (auth()->user()) {

        return view('cart', [
            'products' => product::all()
        ]);
    } else {
        return redirect('/');
    }
}

// change quantity of a product in cart page
public function changeQuantity(Request $request, $id)
{

    $products = product::find($id);
    $allColumns = $products->getAttributes();


    session()->pull('quantity-' . $allColumns['id']);
    session()->put($request->input());
    return back()->with('message', 'quantity updated');
}

//remove product from cart
public function removeFromCart(Request $request, $id)
{

    $products = product::find($id);
    $allColumns = $products->getAttributes();


    session()->pull('quantity-' . $allColumns['id']);
    return back()->with('message', 'Product removed from cart');
}

在 singleProduct.blade.php 中:

徽标}}" alt="product_image">

名称:{{$产品->名称}}

标签:{{$产品->标签}}

描述:{{$产品->描述}}

价格:{{$产品->价格}}


id}}”方法=“POST”> @csrf
            <label for="quantity-{{$product->id}}">quantity</label>
            <input type="number" min="1" name="quantity-{{$product->id}}" value=1>
            <br>
            <button type="submit">Add to cart</button>
        </form>
        

在 cart.blade.php 中:

@foreach($产品作为$产品) @if(Session::has('数量-' .$product->id))

@php
$quantity = Session::get('quantity-' . $product->id);
@endphp

    <p>name: {{$product->name}}</p>
    <p>description: {{$product->description}}</p>
    <p>tags: {{$product->tags}}</p>
    <p>price: {{$product->price}}</p>
    <label for="quantity-{{$product->id}}">quantity</label>

    <form method="POST" action="/cart/{{$product->id}}">
        @csrf

        <input type="number" min="1" name="quantity-{{$product->id}}" value="{{$quantity}}">
        <button type="submit">update</button>
    </form>

    <form method="POST" action="/cart/{{$product->id}}">
        @csrf
        @method('DELETE')
        <button type="submit">remove</button>
    </form>
    
            
            

@endif

@endforeach

© www.soinside.com 2019 - 2024. All rights reserved.