# Laravel框架路由與MVC應用指南
## 引言
Laravel作為目前最流行的PHP框架之一,其優雅的語法和強大的功能深受開發者喜愛。本文將深入探討Laravel框架中路由與MVC(Model-View-Controller)架構的應用,幫助開發者構建結構清晰、可維護的Web應用程序。
## 一、Laravel路由基礎
### 1.1 路由的定義與作用
路由是Web應用程序的入口點,它決定了HTTP請求應該如何被處理。在Laravel中,所有路由定義都在`routes/`目錄下的文件中:
```php
// routes/web.php 示例
Route::get('/', function () {
return view('welcome');
});
Laravel支持多種HTTP動詞的路由:
Route::get($uri, $callback); // 處理GET請求
Route::post($uri, $callback); // 處理POST請求
Route::put($uri, $callback); // 處理PUT請求
Route::patch($uri, $callback); // 處理PATCH請求
Route::delete($uri, $callback); // 處理DELETE請求
Route::any($uri, $callback); // 處理所有HTTP請求
// 基礎參數
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
// 多參數
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
// ...
});
// 參數約束(正則表達式)
Route::get('user/{name}', function ($name) {
// ...
})->where('name', '[A-Za-z]+');
Route::get('user/profile', function () {
// ...
})->name('profile');
// 使用示例
$url = route('profile');
return redirect()->route('profile');
// 中間件分組
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', function () {
// 使用auth中間件
});
});
// 前綴分組
Route::prefix('admin')->group(function () {
Route::get('users', function () {
// 匹配 "/admin/users" URL
});
});
// 命名空間分組
Route::namespace('Admin')->group(function () {
// 控制器位于 "App\Http\Controllers\Admin" 命名空間
});
Route::resource('photos', PhotoController::class);
// 等同于以下路由:
// GET /photos → index()
// GET /photos/create → create()
// POST /photos → store()
// GET /photos/{photo} → show()
// GET /photos/{photo}/edit → edit()
// PUT/PATCH /photos/{photo} → update()
// DELETE /photos/{photo} → destroy()
php artisan make:controller UserController
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
$users = User::all();
return view('users.index', ['users' => $users]);
}
public function show($id)
{
$user = User::findOrFail($id);
return view('users.show', compact('user'));
}
}
HTTP方法 | URI | 控制器方法 | 路由名稱 |
---|---|---|---|
GET | /photos | index | photos.index |
GET | /photos/create | create | photos.create |
POST | /photos | store | photos.store |
GET | /photos/{photo} | show | photos.show |
GET | /photos/{photo}/edit | edit | photos.edit |
PUT/PATCH | /photos/{photo} | update | photos.update |
DELETE | /photos/{photo} | destroy | photos.destroy |
php artisan make:model Post -m # -m選項同時創建遷移文件
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// 指定表名(可選)
protected $table = 'my_posts';
// 批量賦值白名單
protected $fillable = ['title', 'content'];
// 時間戳管理
public $timestamps = true;
}
// 查詢所有記錄
$posts = Post::all();
// 條件查詢
$popularPosts = Post::where('views', '>', 100)
->orderBy('created_at', 'desc')
->take(10)
->get();
// 創建記錄
$post = new Post;
$post->title = 'New Post';
$post->content = 'Content here';
$post->save();
// 或使用create方法
Post::create([
'title' => 'New Post',
'content' => 'Content here'
]);
// 更新記錄
$post = Post::find(1);
$post->title = 'Updated Title';
$post->save();
// 刪除記錄
Post::destroy(1);
// 或
$post->delete();
// 返回簡單視圖
return view('greeting', ['name' => 'James']);
// 檢查視圖是否存在
if (view()->exists('emails.customer')) {
//
}
<!-- 繼承布局 -->
@extends('layouts.app')
@section('title', 'Page Title')
@section('sidebar')
@parent <!-- 保留父模板內容 -->
<p>This is appended to the sidebar</p>
@endsection
@section('content')
<p>This is my body content.</p>
<!-- 條件語句 -->
@if (count($records) === 1)
I have one record!
@elseif (count($records) > 1)
I have multiple records!
@else
I don't have any records!
@endif
<!-- 循環 -->
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor
@foreach ($users as $user)
<p>This is user {{ $user->id }}</p>
@endforeach
@endsection
<!-- resources/views/alert.blade.php -->
<div class="alert alert-danger">
{{ $slot }}
</div>
<!-- 使用組件 -->
<x-alert>
<strong>Whoops!</strong> Something went wrong!
</x-alert>
<!-- 命名插槽 -->
<!-- resources/views/layouts/app.blade.php -->
<x-layout>
<x-slot name="title">
Custom Title
</x-slot>
My page content...
</x-layout>
// routes/web.php
Route::resource('posts', PostController::class);
Route::get('/', [HomeController::class, 'index']);
// app/Http/Controllers/PostController.php
public function index()
{
$posts = Post::latest()->paginate(10);
return view('posts.index', compact('posts'));
}
public function create()
{
return view('posts.create');
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|max:255',
'content' => 'required',
]);
Post::create($validated);
return redirect()->route('posts.index')
->with('success', 'Post created successfully.');
}
// app/Models/Post.php
protected $fillable = ['title', 'content'];
public function user()
{
return $this->belongsTo(User::class);
}
public function comments()
{
return $this->hasMany(Comment::class);
}
<!-- resources/views/posts/index.blade.php -->
@extends('layouts.app')
@section('content')
<div class="container">
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<div class="row">
@foreach($posts as $post)
<div class="col-md-4 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ $post->title }}</h5>
<p class="card-text">{{ Str::limit($post->content, 100) }}</p>
<a href="{{ route('posts.show', $post->id) }}" class="btn btn-primary">Read More</a>
</div>
</div>
</div>
@endforeach
</div>
{{ $posts->links() }}
</div>
@endsection
php artisan route:cache
with()
進行預加載
“`php
// 不好的做法
\(books = Book::all();
foreach (\)books as \(book) {
echo \)book->author->name;
}// 好的做法 $books = Book::with(‘author’)->get();
4. **視圖合成器**:共享公共數據到多個視圖
```php
View::composer('*', function ($view) {
$view->with('currentUser', Auth::user());
});
通過本文的詳細講解,我們系統性地了解了Laravel框架中路由與MVC架構的應用。從基礎路由定義到復雜的MVC交互,從簡單的控制器方法到完整的博客系統實現,Laravel提供了一套完整、優雅的解決方案。掌握這些核心概念后,開發者可以構建出結構清晰、易于維護的現代化Web應用程序。
提示:實際開發中應根據項目需求靈活運用這些技術,并不斷參考Laravel官方文檔獲取最新特性。 “`
這篇文章共計約3400字,全面涵蓋了Laravel路由和MVC的核心概念與應用實踐,采用Markdown格式編寫,包含代碼示例、表格和層級結構,適合作為技術文檔或博客文章。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。