首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Laravel 5 表單構建完整教程:路由、CSRF、模型綁定

     編輯:PHP 綜合知識

路由定義與順序陷阱

// 錯誤順序:通配符搶佔具體路由
Route::get('articles', 'ArticlesController@index');
Route::get('articles/{id}', 'ArticlesController@show');
Route::get('articles/create', 'ArticlesController@create'); // 永不匹配

// 正確順序:特殊路由優先
Route::get('articles', 'ArticlesController@index');
Route::get('articles/create', 'ArticlesController@create');
Route::get('articles/{id}', 'ArticlesController@show');

Laravel 按定義順序匹配路由,{id} 會捕獲 create,導致進入 show 方法。原則:具體路由前置,參數路由後置。

安裝 Illuminate/Html 表單構建器

composer require illuminate/html

config/app.php 註冊:

'providers' => [
    // ...
    'Illuminate\Html\HtmlServiceProvider',
],

'aliases' => [
    'Form' => 'Illuminate\Html\FormFacade',
    'Html' => 'Illuminate\Html\HtmlFacade',
],

視圖構建表單

@extends('layout')
@section('content')
<h1>Write a New Article</h1><hr/>

{!! Form::open(['url' => 'articles']) !!}

<div class="form-group">
    {!! Form::label('title', 'Title:') !!}
    {!! Form::text('title', null, ['class' => 'form-control']) !!}
</div>

<div class="form-group">
    {!! Form::label('body', 'Body:') !!}
    {!! Form::textarea('body', null, ['class' => 'form-control']) !!}
</div>

<div class="form-group">
    {!! Form::submit('Add Article', ['class' => 'btn btn-primary form-control']) !!}
</div>

{!! Form::close() !!}
@stop

關鍵點

  • Form::open(['url' => 'articles']) 自動生成 POST /articles、CSRF _token 隱藏字段、method 欄位。
  • RESTful 慣例:創建頁 GET /articles/create,提交到 POST /articles。

控制器處理提交

use Illuminate\Support\Facades\Request;

public function store() {
    $input = Request::all();           // 獲取所有輸入
    $input['published_at'] = Carbon::now(); // 補全發布時間
    Article::create($input);           // 模型批量賦值
    return redirect('articles');
}

Mass Assignment 防護

Model 必須定義 $fillable 白名單:

protected $fillable = ['title', 'body', 'published_at'];

否則拋出 MassAssignmentException。

首頁按發布時間倒序顯示

public function index() {
    $articles = Article::latest('published_at')->get();
    return view('articles.index', compact('articles'));
}

latest() 等同 orderBy('published_at', 'desc'),語義更清晰。

常見問題排查

現象原因解決
提交報 419/TokenMismatch缺少 CSRF token確認 Form::open 自動生成或手動添加 @csrf
字段不入庫未加入 $fillableModel 添加白名單
路由不匹配定義順序錯誤具體路由前置

總結

Laravel 表單開發核心流程:路由順序 → Form::open 自動 CSRF → Request::all() 獲取數據 → Model::create 批量賦值(需 $fillable) → 重定向。掌握此流程可快速構建安全、規範的 CRUD 介面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved