Laravel 8 CRUD 应用,简单指南

2025-06-07

Laravel 8 CRUD 应用,简单指南

Laravel 是一个基于 PHP 的 Web 框架,语法简洁优雅。它被称为 Web 工匠的框架。其基础架构已经奠定,让 Web 工匠能够从繁琐的琐碎工作中解放出来,尽情创作。Laravel 遵循 MVC(模型视图控制器)架构,并围绕 CRUD(创建、检索、更新、删除)操作进行开发。

Laravel 拥有庞大且不断发展的社区,这使得新开发者能够轻松找到解决方案并应对挑战。Laravel 每年发布两次新版本,最新版本 Laravel 8 于 2020 年 9 月 8 日发布。

本文将指导您使用 Laravel 8 创建您的第一个 CRUD 应用程序。因此,如果您是 Laravel 新手,本文将帮助您从数据库中创建、插入、更新和删除模型。

点击我的个人资料关注我以获取更多更新。

在安装 Laravel 8 之前,你需要在系统上安装一些东西

  • PHP
  • 作曲家
  • 服务器(WAMP、LAMP、XAMPP 等)我用的是 Windows,所以用的是 WAMP。我们将使用 MySQL 作为数据库来存储数据。请确保你的系统上安装了上面列出的软件包。

步骤1:安装Laravel 8

要安装 Laravel 8,我们需要一个作曲家,并确保指定我们需要的 Laravel 版本,在我们的例子中是 Laravel 8。

Composer 创建项目 laravel/laravel=8.0 projectapp --prefer-dist

替代文本
您可以选择使用 Laravel 选项来安装 Laravel,但我更喜欢第一种方法,因为它将安装所有软件包,并且我也可以自由选择我想要的版本

Laravel 新项目应用

使用 Laravel 8,我们已经设置了一些内容,我们不需要复制和重命名 env.example 文件,Laravel 8 会自动为我们完成这些操作
替代文本

Laravel 8 的另一个重要功能是,您无需生成 APP_KEY,新版本会自动生成。 完成所有设置后,我们的应用就准备就绪了。
替代文本

第 2 步:数据库设置

  • 打开你的服务器,在我的情况下是 WAMP 服务器,然后打开 phpmyadmin,然后登录 MySQL 数据库,通过单击左侧窗格上的新建创建一个空数据库替代文本
  • 在 IDE 或文本编辑器上打开 .env 文件,替代文本将 DB_DATABASE 更改为数据库的名称,如果您已为 phpmyadmin 设置了用户名和密码,请指定它,否则,将用户名保留为 root,密码留空。

步骤 3:创建迁移

我们将创建一个用于项目的 CRUD 应用程序,从长远来看,这将是一个项目管理应用程序。我会写更多关于 Laravel 8 的文章,这将是一个系列,目前,我们先就此止步于创建项目 CRUD。
首先,进入项目应用程序cd projectapp/

php artisan make:migration create_projects_table --create=projects

替代文本
迁移文件将在 database/migrations 文件夹中创建,我们需要创建架构,我添加了名称(字符串)、简介(字符串)、位置(字符串)、项目成本(浮点数)、创建日期和更新日期。 在运行迁移命令之前,我们需要指定默认字符串长度,否则会出错。 因此,请转到app/Providers/AppServiceProvider.php并添加
替代文本

Schema::defaultstringLength(191);

在启动函数中,还添加

使用 Illuminate\Support\Facades\Schema;

最后 ,我们运行迁移命令
替代文本

Php工匠迁移

替代文本

步骤4:添加资源路由

我们需要为 CRUD 操作添加路由,Laravel 提供了一个资源路由来处理 CRUD 操作,其中包括一个创建路由、一个检索路由、一个更新路由以及一个删除路由。
因此,请前往 routes\web.php 文件并添加我们的资源路由。

路线::资源('项目',ProjectController::class);

另外,在顶部添加 ProjectController 类,这是在此版本中引入的,Laravel 8 不知道从哪里调用该函数

使用 App\Http\Controllers\ProjectController;

替代文本

步骤5:添加控制器和模型

之前在第4步中,资源的第二个参数是ProjectController,所以我们需要创建控制器,并且需要通过add --model指定资源模型

Php artisan make:controller ProjectController --resource --model=Project

它会询问您是否要创建模型,因为它不存在。输入“yes”后,它将创建模型和控制器。项目控制器已为我们创建,并在控制器文件夹app/Http/Controllers/ProjectController.php 中使用以下方法。
替代文本

  1. 指数()
  2. 创造()
  3. 存储(请求,$请求)
  4. 显示(项目,$project)
  5. 编辑(项目,$project)
  6. 更新(请求,$request,项目,$project)
  7. 销毁(项目,$project)

我为不同的方法编写了代码,只需复制并粘贴即可

<?php
namespace App\Http\Controllers;

use App\Models\Project;
use Illuminate\Http\Request;

class ProjectController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $projects = Project::latest()->paginate(5);

        return view('projects.index', compact('projects'))
            ->with('i', (request()->input('page', 1) - 1) * 5);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('projects.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'introduction' => 'required',
            'location' => 'required',
            'cost' => 'required'
        ]);

        Project::create($request->all());

        return redirect()->route('projects.index')
            ->with('success', 'Project created successfully.');
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Project  $project
     * @return \Illuminate\Http\Response
     */
    public function show(Project $project)
    {
        return view('projects.show', compact('project'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\Project  $project
     * @return \Illuminate\Http\Response
     */
    public function edit(Project $project)
    {
        return view('projects.edit', compact('project'));
    }
    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Project  $project
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Project $project)
    {
        $request->validate([
            'name' => 'required',
            'introduction' => 'required',
            'location' => 'required',
            'cost' => 'required'
        ]);
        $project->update($request->all());

        return redirect()->route('projects.index')
            ->with('success', 'Project updated successfully');
    }
    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Project  $project
     * @return \Illuminate\Http\Response
     */
    public function destroy(Project $project)
    {
        $project->delete();

        return redirect()->route('projects.index')
            ->with('success', 'Project deleted successfully');
    }
}

Enter fullscreen mode Exit fullscreen mode

Laravel 8 创建了一个名为 Models 的文件夹,这在以前的版本中是没有的,所以我们的项目模型位于app/Models/Project.php中,添加以下函数和 fillable,fillable 是数据库中用户可以填写的字段。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
    use HasFactory;

    protected $table = 'projects';
    public $timestamps = true;

    protected $casts = [
        'cost' => 'float'
    ];

    protected $fillable = [
        'name',
        'introduction',
        'created_at',
        'location',
        'cost'
    ];
}
Enter fullscreen mode Exit fullscreen mode

步骤 6:添加您的视图

Laravel 视图文件称为 blade 文件,我们将添加这些 blade 文件,以便用户能够与我们的应用程序进行交互
我喜欢根据模型安排我的视图,所以我将在resources/views文件夹中创建两个文件夹

  1. 布局
    • 应用程序.blade.php
  2. 项目
    • 索引.blade.php
    • 创建.blade.php
    • 编辑.blade.php
    • 显示.blade.php

应用程序.blade.php

<html>

<head>
    <title>App Name - @yield('title')</title>

    <!-- Bootstrap -->
    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.css" rel="stylesheet">

    <!-- Font Awesome JS -->
    <script defer src="https://use.fontawesome.com/releases/v5.0.13/js/solid.js"
        integrity="sha384-tzzSw1/Vo+0N5UhStP3bvwWPq+uvzCMfrN1fEFe+xBmv1C/AtVX5K0uZtmcHitFZ" crossorigin="anonymous">
    </script>
    <script defer src="https://use.fontawesome.com/releases/v5.0.13/js/fontawesome.js"integrity="sha384-6OIrr52G08NpOFSZdxxz1xdNSndlD4vdcf/q2myIUVO0VsqaGHJsB0RaBE01VTOY" crossorigin="anonymous">
    </script>

    <style>
        .footer {
            position: fixed;
            left: 0;
            bottom: 0;
            width: 100%;
            background-color: #9C27B0;
            color: white;
            text-align: center;
        }

    </style>

</head>

<body>
    @section('sidebar')

    @show

    <div class="container">
        @yield('content')
    </div>
    <div class="text-center footer">

        <h4>The writer needs a job</h4>
        <h4>+234 806 605 6233</h4>
        <h4>kingsconsult001@gmail.com</h4>

    </div>
</body>

</html>
Enter fullscreen mode Exit fullscreen mode

索引.blade.php

@extends('layouts.app')

@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2>Laravel 8 CRUD </h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-success" href="{{ route('projects.create') }}" title="Create a project"> <i class="fas fa-plus-circle"></i>
                    </a>
            </div>
        </div>
    </div>

    @if ($message = Session::get('success'))
        <div class="alert alert-success">
            <p>{{ $message }}</p>
        </div>
    @endif

    <table class="table table-bordered table-responsive-lg">
        <tr>
            <th>No</th>
            <th>Name</th>
            <th>Introduction</th>
            <th>Location</th>
            <th>Cost</th>
            <th>Date Created</th>
            <th width="280px">Action</th>
        </tr>
        @foreach ($projects as $project)
            <tr>
                <td>{{ ++$i }}</td>
                <td>{{ $project->name }}</td>
                <td>{{ $project->introduction }}</td>
                <td>{{ $project->location }}</td>
                <td>{{ $project->cost }}</td>
                <td>{{ date_format($project->created_at, 'jS M Y') }}</td>
                <td>
                    <form action="{{ route('projects.destroy', $project->id) }}" method="POST">

                        <a href="{{ route('projects.show', $project->id) }}" title="show">
                            <i class="fas fa-eye text-success  fa-lg"></i>
                        </a>

                        <a href="{{ route('projects.edit', $project->id) }}">
                            <i class="fas fa-edit  fa-lg"></i>

                        </a>

                        @csrf
                        @method('DELETE')

                        <button type="submit" title="delete" style="border: none; background-color:transparent;">
                            <i class="fas fa-trash fa-lg text-danger"></i>

                        </button>
                    </form>
                </td>
            </tr>
        @endforeach
    </table>

    {!! $projects->links() !!}

@endsection

Enter fullscreen mode Exit fullscreen mode

创建.blade.php

@extends('layouts.app')

@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2>Add New Product</h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-primary" href="{{ route('projects.index') }}" title="Go back"> <i class="fas fa-backward "></i> </a>
            </div>
        </div>
    </div>

    @if ($errors->any())
        <div class="alert alert-danger">
            <strong>Whoops!</strong> There were some problems with your input.<br><br>
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif
    <form action="{{ route('projects.store') }}" method="POST" >
        @csrf

        <div class="row">
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Name:</strong>
                    <input type="text" name="name" class="form-control" placeholder="Name">
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Introduction:</strong>
                    <textarea class="form-control" style="height:50px" name="introduction"
                        placeholder="Introduction"></textarea>
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Location:</strong>
                    <input type="text" name="location" class="form-control" placeholder="Location">
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Cost:</strong>
                    <input type="number" name="cost" class="form-control" placeholder="Cost">
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12 text-center">
                <button type="submit" class="btn btn-primary">Submit</button>
            </div>
        </div>

    </form>
@endsection
Enter fullscreen mode Exit fullscreen mode

编辑.blade.php

@extends('layouts.app')

@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2>Edit Product</h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-primary" href="{{ route('projects.index') }}" title="Go back"> <i class="fas fa-backward "></i> </a>
            </div>
        </div>
    </div>

    @if ($errors->any())
        <div class="alert alert-danger">
            <strong>Whoops!</strong> There were some problems with your input.<br><br>
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

    <form action="{{ route('projects.update', $project->id) }}" method="POST">
        @csrf
        @method('PUT')

        <div class="row">
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Name:</strong>
                    <input type="text" name="name" value="{{ $project->name }}" class="form-control" placeholder="Name">
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Introduction:</strong>
                    <textarea class="form-control" style="height:50px" name="introduction"
                        placeholder="Introduction">{{ $project->introduction }}</textarea>
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Location:</strong>
                    <input type="text" name="location" class="form-control" placeholder="{{ $project->location }}"
                        value="{{ $project->location }}">
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12">
                <div class="form-group">
                    <strong>Cost:</strong>
                    <input type="number" name="cost" class="form-control" placeholder="{{ $project->cost }}"
                        value="{{ $project->location }}">
                </div>
            </div>
            <div class="col-xs-12 col-sm-12 col-md-12 text-center">
                <button type="submit" class="btn btn-primary">Submit</button>
            </div>
        </div>

    </form>
@endsection
Enter fullscreen mode Exit fullscreen mode

显示.blade.php

@extends('layouts.app')


@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left">
                <h2>  {{ $project->name }}</h2>
            </div>
            <div class="pull-right">
                <a class="btn btn-primary" href="{{ route('projects.index') }}" title="Go back"> <i class="fas fa-backward "></i> </a>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Name:</strong>
                {{ $project->name }}
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Introduction:</strong>
                {{ $project->introduction }}
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Location:</strong>
                {{ $project->location }}
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Cost:</strong>
                {{ $project->cost }}
            </div>
        </div>
        <div class="col-xs-12 col-sm-12 col-md-12">
            <div class="form-group">
                <strong>Date Created:</strong>
                {{ date_format($project->created_at, 'jS M Y') }}
            </div>
        </div>
    </div>
@endsection
Enter fullscreen mode Exit fullscreen mode

一切已准备就绪

php artisan 服务

替代文本

http://127.0.0.1:8000/projects/

替代文本

http://127.0.0.1:8000/projects/create

替代文本

http://127.0.0.1:8000/projects/1/edit

替代文本

http://127.0.0.1:8000/projects/1

替代文本

获取完整代码

https://github.com/Kingsconsult/laravel_8_crud

文章来源:https://dev.to/kingsconsult/laravel-8-crud-bi9
PREV
我的新全栈开发人员组合
NEXT
Laravel 8 Auth(注册和登录)