Laravel 学习笔记三: 创建简单的api工程

自己使用 laravel 框架创建 api 工程的一些记录

创建工程#

composer create-project laravel/laravel LaravelApi

运行项目#

 php artisan serve //默认127.0.0.1, 8000端口
 php artisan serve --host 192.168.20.77:8000 //修改自己的ip和端口号 

这里使用了 artisan (中文名:工匠) 脚本里面的 serve 命令,意思是在 php 开发服务器上为应用程序提供服务,artisan 还提供其它的命令,可以使用 php artisan list 查看

服务正常启动后就可以通过 http://127.0.0.1:8000 打开首页

关于 APP_KEY#

使用 php artisan key:generate 会在配制文件.env 生成 APP_KEY

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:sY6AGaeWSWsUJo6vBbE+z2/RuEPY92PO5JhYOsscp+E=
APP_DEBUG=true
APP_URL=http://localhost

这个 key 是传给 Illuminate\Encryption\Encrypter 用于加密数据的,比如加密 cookie,看了一下 Encrypter 的构造方法,key 是外部传进来的

那 key 是怎么传给 Encrypter 的呢

注册 service providers#

首先在 config\app.php 中注册 EncryptionServiceProvider

<?php
return [
    ...
    'key' => env('APP_KEY'),//读取APP_KEY
    'providers' => [
        ...
        Illuminate\Encryption\EncryptionServiceProvider::class,
        ...
    ]

Encrypter 初始化#

public function register()
    {
        $this->registerEncrypter();
        $this->registerOpisSecurityKey();
        $this->registerSerializableClosureSecurityKey();
    }

 protected function registerEncrypter()
    {
         $this->app->singleton('encrypter', function ($app) {
         $config = $app->make('config')->get('app');
         //就是在这一步把key传进来的
         return  new  Encrypter($this->parseKey($config), $config['cipher']);
                });
    }

使用命令创建模型,控制器,#

 php artisan make:model Product -mc

该命令会在

  • app\Http\Controllers 下创建控制器 ProductController.php
  • app\Models 下创建模型 Product.php
  • app\database\migrations 下创建 2022_10_14_092952_create_products_table.php, 用于后面创建对应的表

创建相应的资源文件#

php artisan make:resource Product

命令会在 ```app\Http\Resources 下创建 Product.php, 这个资源可以将你的模型以及模型集合转换为 JSON

数据库相关配置#

修改表字段#

打开 app\database\migrations\2022_10_14_092952_create_products_table.php 修改里面的 up 方法

public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->integer('price');
            //这个会自动创建 created_at和updated_at,类型为timestramp
            $table->timestamps('');
        });
    }

使用命令创建表#

 php artisan migrate //migrate(中文:移动,迁徙)

这样就会自动生成 products 和对应的列

填充测试数据#

使用下面命令创建配置文件

php artisan make:seeder ProductSeeder

会在 app\database\seeders 生成 ProductSeeder.php 文件,修改里面的 run 方法

class ProductSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {

        DB::table('products')->insert([
            'id' => 1,
            'name' => 'zw',
            'price' => 123,
            'created_at' => date("Y-m-d H:i:s"),
            'updated_at' => date("Y-m-d H:i:s"),
        ]);
    }
}

执行命令填充数据

php artisan db:seed --class=ProductSeeder

这里默认情况下, db:seed 命令将运行 Database\Seeders\DatabaseSeeder 类,这里指定运行 ProductSeeder

配置路由#

打开文件 app\routes\api.php, 添加下面配置

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ProductController;

//这里有个问题,如果直接写'ProductController@show',会找不到这个类,所以写了完整的路径
Route::get('/products/{id}', 'App\Http\Controllers\ProductController@show');

修改控制器#

打开 app\Http\Resources\Product.php资源文件 , 编辑如下:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Product extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    public function toArray($request)
    {
        //这个会以json的形式输出
        return [
            'id' => $this->id,
            'name' => $this->name,
            'price' => $this->price,
            'created_at' => (String)$this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

打开文件 app\Http\Controllers\ProductController.php, 修改如下:

<?php

namespace App\Http\Controllers;

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

use App\Http\Resources\Product as ProductResource;


class ProductController extends Controller
{

    public function show($id){
        return new ProductResource(Product::find($id));
    }
}

这里因为都用到了相同的 Product 名字,所以要使用 use as 命令做一下区分

效果#

请求 http://127.0.0.1:8000/api/products/1 就会返回 json 数组

{"data":{"id":1,"name":"zw","price":123,"created_at":"2022-10-14 10:41:18","updated_at":"2022-10-14T10:41:18.000000Z"}}

总结#

在这个简单的项目里面学习到知识做一下总结

  • 创建 laravel 项目使用 composer create-project laravel/laravel 项目名
  • 使用脚本 artisan 脚本命令配制项目,启动 serve, 自动生成模型 make:model, 数据库迁移 migrate, 填充测试数据 db:seed

参考#

使用 Laravel 的 API 资源功能来构建你的 API

本作品采用《CC 协议》,转载必须注明作者和本文链接
君子博学而日参省乎己,则知明而行无过矣
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。