Laravel Framework使用指南 – wiki基地

Laravel 框架使用指南:从入门到精通

Laravel 是一个优雅、强大且功能丰富的 PHP Web 应用程序框架,遵循 MVC(模型-视图-控制器)设计模式。它以其简洁的语法、丰富的功能集和活跃的社区而闻名,是构建各种规模 Web 应用程序的理想选择。本指南将带您深入了解 Laravel,从安装配置到高级特性,助您掌握这一强大的工具。

一、 初识 Laravel

  1. 为什么要选择 Laravel?

    • 优雅的语法: Laravel 致力于提供开发者愉悦的开发体验。其代码清晰易读,减少了不必要的复杂性。
    • MVC 架构: 模型、视图和控制器分离,使代码组织更有条理,易于维护和测试。
    • 强大的功能集: 内置了路由、模板引擎(Blade)、ORM(Eloquent)、数据库迁移、Artisan 命令行工具、测试支持等众多功能,开箱即用。
    • 活跃的社区和丰富的生态系统: 遇到问题时,可以轻松获得帮助。大量的第三方包(Packages)扩展了 Laravel 的功能。
    • 安全性: 内置了防止常见 Web 攻击(如 CSRF、XSS)的机制。
    • 可扩展性: 可以轻松构建小型项目,也能应对大型、高流量的应用。
  2. 安装与配置

    • 系统要求:

      • PHP >= 7.3 (建议 PHP 8.0 或更高)
      • Composer (PHP 依赖管理工具)
      • 数据库 (MySQL, PostgreSQL, SQLite, SQL Server)
      • Web 服务器 (Apache, Nginx)
    • 安装 Laravel:

      bash
      composer create-project --prefer-dist laravel/laravel your-project-name

      这将在当前目录下创建一个名为 your-project-name 的新 Laravel 项目。

    • 目录结构:

      • app/: 包含应用程序的核心代码,如模型、控制器、提供者等。
      • bootstrap/: 包含框架的启动文件和自动加载配置。
      • config/: 包含应用程序的配置文件。
      • database/: 包含数据库迁移、种子和工厂文件。
      • public/: Web 服务器的文档根目录,包含入口文件 index.php 和静态资源。
      • resources/: 包含视图、语言文件和未编译的资源(如 Sass, Less, JavaScript)。
      • routes/: 包含应用程序的路由定义。
      • storage/: 包含日志、缓存文件和框架生成的文件。
      • tests/: 包含测试文件。
      • vendor/: Composer 安装的依赖包。
    • 配置环境 (.env):

      Laravel 使用 .env 文件来配置环境特定的变量,如数据库连接、邮件设置等。 .env.example 文件提供了默认配置,您可以复制它并重命名为 .env,然后根据您的环境进行修改。 重要配置项包括:

      • APP_NAME: 应用程序名称。
      • APP_ENV: 应用程序环境 (local, production, staging, testing)。
      • APP_KEY: 应用程序密钥,用于加密等安全操作。 首次安装后,使用 php artisan key:generate 生成。
      • APP_DEBUG: 是否开启调试模式 (在开发环境中开启,生产环境中关闭)。
      • DB_CONNECTION: 数据库连接类型 (mysql, pgsql, sqlite, sqlsrv)。
      • DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD: 数据库连接信息。
    • 运行开发服务器:

      bash
      php artisan serve

      这将在 http://localhost:8000 启动一个内置的开发服务器。

二、 核心概念

  1. 路由 (Routing):

    路由负责将 URL 请求映射到相应的控制器和操作。 Laravel 的路由定义在 routes/web.php 文件中。

    “`php
    // 基本路由
    Route::get(‘/’, function () {
    return view(‘welcome’);
    });

    // 带参数的路由
    Route::get(‘/users/{id}’, function ($id) {
    return “User ID: ” . $id;
    });

    // 指定控制器和方法
    Route::get(‘/users’, [UserController::class, ‘index’]);

    // 命名路由
    Route::get(‘/profile’, [UserController::class, ‘show’])->name(‘profile’);

    // 生成 URL (使用命名路由)
    $url = route(‘profile’);

    // 重定向路由
    Route::redirect(‘/here’, ‘/there’, 301); // 301 永久重定向

    // 视图路由 (直接返回视图)
    Route::view(‘/welcome’, ‘welcome’);
    Route::view(‘/about’, ‘about’, [‘name’ => ‘Taylor’]); // 传递数据给视图

    //资源路由(为典型的”CRUD”资源自动创建路由)
    Route::resource(‘photos’, PhotoController::class);
    //上述代码将自动生成如下路由:
    /
    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
    /

    “`

  2. 控制器 (Controllers):

    控制器负责处理请求、与模型交互、准备数据并返回视图或响应。

    “`php
    <?php

    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::find($id); // 根据 ID 获取用户
        return view('users.show', ['user' => $user]);
    }
    
    public function create()
    {
        return view('users.create');
    }
    
    public function store(Request $request)
    {
         //验证传入的请求
          $validated = $request->validate([
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
          ]);
        // 创建新用户 (通常使用 Eloquent 模型)
         $user = User::create([
             'name' => $request->input('name'), //从请求中获取数据
             'email'=> $request->input('email'),
             'password' => Hash::make($request->input('password')),
          ]);
          return redirect('/users')->with('success', '用户创建成功!');
    }
    //编辑
    public function edit(User $user)
    {
         return view('users.edit',compact('user'));
    }
    
    //更新
    public function update(Request $request, User $user)
    {
         $validated = $request->validate([
            'name' => 'required|max:255',
            'email' => 'required|email',
         ]);
    
         $user->update($validated);
    
        return redirect('/users')->with('success', '用户更新成功!');
    }
    //删除
    public function destroy(User $user)
    {
       $user->delete();
    
       return redirect('/users')->with('success', '用户删除成功!');
    }
    

    }
    “`

    使用 Artisan 命令创建控制器:

    bash
    php artisan make:controller UserController

  3. 视图 (Views) 和 Blade 模板引擎:

    视图负责显示数据。Laravel 使用 Blade 模板引擎,它提供了简洁、强大的语法来构建动态页面。Blade 模板文件通常位于 resources/views 目录下,并使用 .blade.php 扩展名。

    “`blade
    {{– resources/views/users/index.blade.php –}}

    @extends(‘layouts.app’) {{– 继承布局 –}}

    @section(‘title’, ‘User List’) {{– 定义 section –}}

    @section(‘content’)

    User List

    @if (count($users) > 0)
        <ul>
            @foreach ($users as $user)
                <li>
                    <a href="{{ route('users.show', ['user' => $user->id]) }}">{{ $user->name }}</a>
                </li>
            @endforeach
        </ul>
    @else
        <p>No users found.</p>
    @endif
    
     {{-- 显示会话中的成功消息 --}}
     @if (session('success'))
         <div class="alert alert-success">
            {{ session('success') }}
         </div>
      @endif
    

    @endsection
    “`

    • @extends: 继承布局文件。
    • @section: 定义内容块。
    • @yield: 在布局文件中占位,用于插入内容块。
    • {{ ... }}: 输出变量或表达式的值 (自动转义,防止 XSS)。
    • {!! ... !!}: 输出未转义的内容 (谨慎使用)。
    • @if, @elseif, @else, @endif: 条件语句。
    • @foreach, @endforeach: 循环语句。
    • @forelse, @empty, @endforelse : 循环, 并在数组为空时显示内容.
    • @include: 包含其他视图。
    • @csrf: 生成 CSRF 令牌字段。
    • {{ route(...) }}: 生成命名路由的 URL。
  4. 模型 (Models) 和 Eloquent ORM:

    模型代表数据库中的数据表。Laravel 的 Eloquent ORM 提供了与数据库交互的优雅方式。

    “`php
    <?php

    namespace App\Models;

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

    class User extends Model
    {
    use HasFactory;

    protected $table = 'users'; // 指定表名 (如果不是模型名称的复数形式)
    
     //定义允许批量赋值的属性。
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
    
     //隐藏模型中的属性,使其不出现在数组或 JSON 表示形式中。
    protected $hidden = [
      'password',
      'remember_token',
    ];
    

    // 定义与其他模型的关系
    public function posts()
    {
    return $this->hasMany(Post::class);
    }

    }
    “`

    使用 Artisan 命令创建模型:

    bash
    php artisan make:model User

    Eloquent 常用操作:

    • User::all(): 获取所有用户。
    • User::find($id): 根据 ID 获取用户。
    • User::where('status', 'active')->get(): 根据条件获取用户。
    • $user = new User; 创建新用户。
    • $user->name = 'John Doe'; 设置属性。
    • $user->save(); 保存用户。
    • $user->update(['name' => 'Jane Doe']); 更新用户。
    • $user->delete(); 删除用户。
    • User::create([...]) 创建并保存一个用户实例
  5. 数据库迁移 (Migrations):

    数据库迁移就像数据库的版本控制,允许您轻松地创建、修改和共享数据库结构。

    使用 Artisan 命令创建迁移:

    bash
    php artisan make:migration create_users_table

    迁移文件位于 database/migrations 目录下。

    “`php
    <?php

    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;

    class CreateUsersTable extends Migration
    {
    public function up()
    {
    Schema::create(‘users’, function (Blueprint $table) {
    $table->id(); // 自增 ID
    $table->string(‘name’);
    $table->string(’email’)->unique();
    $table->timestamp(’email_verified_at’)->nullable();
    $table->string(‘password’);
    $table->rememberToken();
    $table->timestamps(); // 创建 created_at 和 updated_at 字段
    });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
    

    }
    “`

    运行迁移:

    bash
    php artisan migrate

    回滚迁移:

    bash
    php artisan migrate:rollback

  6. 数据库填充 (Seeding):

    数据库填充用于向数据库中填充测试数据或初始数据。

    创建 Seeder:

    bash
    php artisan make:seeder UsersTableSeeder

    Seeder 文件位于 database/seeders 目录下。

    “`php
    // database/seeders/UsersTableSeeder.php
    <?php
    namespace Database\Seeders;

    use Illuminate\Database\Seeder;
    use Illuminate\Support\Facades\DB;
    use Illuminate\Support\Facades\Hash;

    class UsersTableSeeder extends Seeder
    {

    public function run()
    {
        DB::table('users')->insert([
           'name' => 'Admin User',
           'email' => '[email protected]',
           'password' => Hash::make('password'),
         ]);
    
         // 使用模型工厂
        \App\Models\User::factory(10)->create();
    }
    

    }

    // database/seeders/DatabaseSeeder.php 默认的 DatabaseSeeder 类
    <?php
    namespace Database\Seeders;

    // use Illuminate\Database\Console\Seeds\WithoutModelEvents;
    use Illuminate\Database\Seeder;

    class DatabaseSeeder extends Seeder
    {
    public function run()
    {
    $this->call([
    UsersTableSeeder::class,
    // 添加其他的 Seeder 类
    ]);
    }
    }

    “`
    运行填充:

    bash
    php artisan db:seed

  7. 请求 (Request) 和响应 (Response):

    Laravel 提供了强大的 Request 对象来访问 HTTP 请求数据(如输入、文件、cookies 等)。

    “`php
    // 在控制器方法中
    public function store(Request $request)
    {
    $name = $request->input(‘name’); // 获取输入值
    $email = $request->email; // 也可以这样访问
    $file = $request->file(‘photo’); // 获取上传的文件

    if ($request->has('name')) {  // 检查输入是否存在
        // ...
    }
    
    if ($request->isMethod('post')) { // 检查请求方法
        // ...
    }
      // 获取所有输入数据
     $data = $request->all();
    

    }
    “`
    响应可以是多种形式:

    “`php
    //返回视图
    return view(‘greeting’, [‘name’ => ‘James’]);

    //返回字符串
    return 'Hello World';
    
    //返回 JSON
    

    return response()->json([‘name’ => ‘Abigail’, ‘state’ => ‘CA’]);

    //重定向
    return redirect(‘/home’);
    return redirect()->route(‘login’);

    “`

三、 进阶特性

  1. 服务容器 (Service Container) 和依赖注入 (Dependency Injection):

    服务容器是 Laravel 的核心,用于管理类之间的依赖关系。依赖注入是一种设计模式,它允许您将类的依赖项传递给类,而不是在类内部创建它们。这使得代码更易于测试和维护。
    Laravel 会自动解析控制器、事件监听器、中间件等中的依赖项。

  2. 服务提供者 (Service Providers):

    服务提供者是 Laravel 应用程序的引导中心。它们负责注册服务到服务容器、绑定接口到实现、配置应用程序等。
    config/app.php 文件中的 providers 数组列出了应用程序加载的服务提供者。

  3. 中间件 (Middleware):

    中间件提供了一种方便的机制来过滤进入应用程序的 HTTP 请求。例如,Laravel 包含一个验证用户身份的中间件。

    创建中间件:

    bash
    php artisan make:middleware CheckAge

    “`php
    // app/Http/Middleware/CheckAge.php
    <?php
    namespace App\Http\Middleware;

    use Closure;
    use Illuminate\Http\Request;

    class CheckAge
    {
    public function handle(Request $request, Closure $next)
    {
    if ($request->age <= 200) {
    return redirect(‘home’); //如果不符合条件,可以重定向或者返回错误
    }

        return $next($request); // 将请求传递给下一个中间件或应用程序
    }
    

    }

    //在 app/Http/Kernel.php 中注册中间件
    protected $routeMiddleware = [
    // …
    ‘age’ => \App\Http\Middleware\CheckAge::class,
    ];

    //在路由中使用
    Route::get(‘/adult’, [SomeController::class, ‘index’])->middleware(‘age’);

    “`

  4. 事件 (Events) 和监听器 (Listeners):

    Laravel 的事件系统提供了一种简单的方式来实现观察者模式,允许您在应用程序中的特定点触发事件,并让其他部分的代码监听并响应该事件。

  5. 队列 (Queues):

    队列允许您将耗时的任务(如发送电子邮件、处理图像)推迟到后台处理,从而提高应用程序的响应速度。Laravel 支持多种队列驱动(如数据库、Redis、Beanstalkd、Amazon SQS)。

  6. 任务调度 (Task Scheduling):

    任务调度允许您在特定的时间或间隔内自动执行任务。 您可以在 app/Console/Kernel.phpschedule 方法中定义任务。

  7. 测试 (Testing):

    Laravel 提供了强大的测试支持,包括单元测试、功能测试和浏览器测试(使用 Laravel Dusk)。

四、 最佳实践

  • 遵循 PSR (PHP Standards Recommendations) 编码规范。
  • 使用版本控制 (如 Git)。
  • 编写清晰、可维护的代码,并添加注释。
  • 充分利用 Laravel 的内置功能,避免重复造轮子。
  • 保持代码整洁,定期重构。
  • 编写单元测试和功能测试,确保代码质量。
  • 关注安全性,防止常见的 Web 攻击。
  • 使用缓存来提高性能。
  • 学习并使用 Laravel 生态系统中的优秀包。
  • 持续学习和探索 Laravel 的新特性。

五、 总结

Laravel 是一个功能强大、易于学习和使用的 PHP 框架。它提供了丰富的功能集、优雅的语法和活跃的社区,使其成为构建各种规模 Web 应用程序的理想选择。通过本指南,您已经对 Laravel 的核心概念和高级特性有了深入的了解。现在,您可以开始构建自己的 Laravel 应用程序,并不断探索和实践,成为一名 Laravel 专家!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部