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 协议》,转载必须注明作者和本文链接
君子博学而日参省乎己,则知明而行无过矣
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!