【问题标题】:Laravel: module is not stored to the databaseLaravel:模块未存储到数据库中
【发布时间】:2021-11-30 22:30:51
【问题描述】:

当我尝试使用 create 方法将某些内容上传到数据库时,它不会存储在数据库中。看起来页面刚刚刷新。我对 Laravel 还很陌生,因此我们将不胜感激。

下面我分别提供了我的刀片视图的顶部、我的路线和我的控制器。有人可以帮助我吗?我搜索了许多其他主题,但找不到我的问题的解决方案。

@extends('layouts.app')

@section('content')
<div class="container">
    <form action="/module" enctype="multipart/form-data" method="POST">

        @csrf
        

        <div class="row">
            <div class="col-8 offset-2">
                <div class="row"><h3>Add New Module</h3></div>

                <div class="form-group row">
                    <label for="title" class="col-md-4 col-form-label">Module Title</label>


                    <input id="title"
                           type="text"
                           class="form-control @error('title') is-invalid @enderror"
                           name="title"
                           value="{{ old('title') }}"
                           autocomplete="title" autofocus>

                    @error('title')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror

                </div>

                <div class="form-group row">
                    <label for="category" class="col-md-4 col-form-label">Category</label>


                     <select id="category" onchange="getCategories()" class=" mt-1 block w-full py-2 px-3 border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm p-1.5 px-3 border-2  @error('category') border-red-500 @enderror">
                        <option disabled selected value> -- Kies één van de opties -- </option>
                        <option value="Schil">Schil</option>
                        <option value="Afbouw">Afbouw</option>
                        <option value="Installatie">Installatie</option>
                        <option value="Afwerking">Afwerking</option>
                    </select>

                    @error('category')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror

                </div>

路线:

    Route::get('/', function () {
    return view('welcome');
    });
    
    Auth::routes();
    
    Route::get('/module/create', 'App\Http\Controllers\ModulesController@create');
    Route::post('/module', 'App\Http\Controllers\ModulesController@store');

控制器:

class ModulesController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function create()
    {
        return view('modules/create');
    }

    public function store()
    {
        $data = request()->validate([
            'title' => ['required', 'string', 'max:50'],
            'description' => ['required', 'string', 'max:255'],
            'price' => ['required', 'string'],
            'category' => ['required', 'string'],
            'subcategory' => ['required', 'string'],
            'image' => ['required', 'image'],
        ]);



        auth()->user()->modules()->create($data);


        
    }
}

【问题讨论】:

  • 您是否尝试在操作字段中输入“{{route('module')}}”?也不需要@method('POST'),因为您已经在方法字段中告诉表单应如何发送请求。
  • 它在哪里显示错误:在 PhpStorm 或实际网站上(所以这是 Laravel 运行时错误)?
  • @LazyOne 在浏览器中显示错误
  • 您在哪个 URL 上收到错误消息?你做了什么来得到那个 URL 和错误?
  • 当我尝试转到“127.0.0.1:8000/module”时,它显示以下错误:“Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException 此路由不支持 GET 方法。支持的方法:POST。”

标签: laravel methods routes


【解决方案1】:

问题 1

您提到“看起来页面刚刚刷新” - 这听起来像是出现验证问题时可能发生的情况,对吧?检查您的代码,我看不到任何会显示验证错误的地方。所以也许验证失败了,Laravel 让你返回表单告诉你有一个验证错误——但是这些错误没有显示出来,所以看起来你刚刚刷新了页面!这完全符合您的描述。

如何显示验证错误是described clearly in the docs。在表单页面的某处包含此代码:

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

问题 2

由于第一个问题,您还没有遇到这个问题,但是一旦解决了,您就会遇到。一旦你的新模型是create()-d,当前代码中什么都不会发生。这意味着您在提交表单后会在浏览器中看到一个白色/空白页面,这不是一个很好的用户体验。那你想做什么?通常重定向到您刚刚创建的东西的某种索引列表是要走的路。例如,您可能想要一个列出所有当前用户模块的页面。约定是在/modules 处,所以在你的store() 方法结束时,你可以有类似的东西:

return redirect('/modules');

请注意,这只是一个示例,在您执行以下操作之前不会真正起作用:

  • 为该 URL 添加路由;
  • 添加相应的生成列表的控制器方法;
  • 添加一个视图以显示该列表;

【讨论】:

    【解决方案2】:

    我认为您不需要@method('post'),只需将其删除即可。 最好将帖子路由命名为Route::post('/module', [App\Http\Controllers\ModulesController::class, 'store')-&gt;name('module.store'); 然后action={{ route('module.store') }} 如果你有&lt;button type="submit" class="btn btn-primary"&gt;Save&lt;/button&gt; &lt;/form&gt; 结束标记之前

    【讨论】:

    • 谢谢!但是,这给了我一个新错误:Route [modules.store] not defined
    • 尝试从终端运行php artisan route:cache
    • 你不应该在开发中缓存路由。 From the docs: "...您应该只在项目部署期间运行 route:cache 命令。"。也许你的意思是php artisan route:clear
    • php artisan route:cache 将通过缓存文件中的单个方法调用注册,如果有数百个路由,它将提高路由注册时间的性能。由于它使用 PHP 序列化,您可能会发现有时只缓存基于控制器的路由,而且 PHP 无法序列化其他路由。
    • “部署期间”您可以致电php artisan route:cache(非生产)。如果您添加任何新路由(通常我们在开发期间添加),您将需要生成新的路由缓存。
    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2018-11-25
    • 2016-08-27
    • 2019-07-12
    • 1970-01-01
    相关资源
    最近更新 更多