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 协议》,转载必须注明作者和本文链接
推荐文章: