laravel中的api资源
创建一个 Product 资源
API 资源是在 Laravel 中将你的模型以及模型集合转换为 JSON 的新特性。接下来让我们创建一个 Product 的资源。
php artisan make:resource Product
你可以在 app/Http/Resources 目录下看到你刚刚生成的 Product 资源
当然我们还需要 Product 的数据库迁移、模型和控制器。我们能用这个命令快速的创建这些。
php artisan make:model Product -mc
打开database/migrations中会有product表的添加信息,打开修改up中的内容
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('price');
$table->timestamps();
});
}
注意:看别人说的是这里的价格字段是整型的。 永远不要用浮点型存储你的价格数据!
到目前为止,我们已经有模型,控制器,数据库迁移以及用以转换模型和模型集合为 JSON 的资源类。那么接下来呢?
在这之前,什么是资源类?我们在 resources 文件夹中创建的 Product 类又是什么?一个资源类表示了单个模型转换为 JSON 的结构。
结合上面所阐述的,让我们来打开 Product.php 资源类文件。
这里有一个 toArray 方法,这个就是在我们发送响应时返回需要转换为 JSON 的属性数组的方法。
我们来修改它,让我们可以有更好的点子。
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'price' => $this->price,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}
使用 Product 资源
我们刚刚更改了 toArray 方法,让我们继续在我们的控制器中使用 product 资源。
product 控制器是看起来是这样的:
<?php
namespace App\Http\Controllers;
use App\Product;
use App\Http\Resources\Product as ProductResource;
class ProductController extends Controller
{
public function show ($id)
{
return new ProductResource(Product::find($id));
}
}
为了转换 product ,我们仅仅在 product 资源类中传递了一个 product。
让我们创建一个 show 方法的路由,看一看结果。
打开 api.php 文件,在中间件外部创建这个路由。
Route::get(’/products/{id}’, ‘ProductController@show’);
现在,看看 create_at 和 updated_at 时间戳。如果你想要的是返回一个实际时间戳的字符串?那么你可以像这个例子中,强制类型转换为字符串:
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'test' => 'This is just a test',
'created_at' => (string)$this->created_at,
'updated_at' => (string)$this->updated_at,
];
}
还有一种强制转换数据格式的方法,就是在model里面,运用 $casts将两个时间转为字串类型
class Products extends Model
{
use SoftDeletes; // 开启软删除
public $table = 'product';
protected $fillable = ['name','test'];
public $casts = [
'created_at' => 'string',
'updated_at' => 'string'
];
protected $default = [
'price' => '11111'
];
protected $dispatchesEvents = [
'created' => ProductCreatedEvent::class,
'saved' => ProductCreatedEvent::class,
'deleted' => ProductCreatedEvent::class,
];
public function __construct($attributes = [])
{
$attributes = array_merge($this->default, $attributes);
parent::__construct($attributes);
}
public function user()
{
return $this->hasOne(User::class,'id','user_id');
}
}
解释:1.model里面 public $table = ‘product’;这句的意思就是有时会报找不到Product这个类,这句是指定库中的这个表名,就不会报这个错误了。
2. protected $fillable = [‘name’,‘test’];这句是批量添加的字段,没有写price,那么添加或者编辑时就不会对price做任何改变,price字段就为空。
3. 这句use SoftDeletes; // 开启软删除,删除的这条记录仍存在,只不过delete_at里面会有值,在列表中也不会读出来,这是laravel框架封装好的。
4. 下面那个use方法是表与表的关联关系。
5. protected KaTeX parse error: Expected group after '_' at position 26: …ublic function _̲_construct(attributes = [])是添加默认值
6. protected $dispatchesEvents 是封装的事件类
Events 目录默认是不存在的,它会在你运行 Artisan 命令 event:generate 或 event:make 时生成。Events 目录存放了 事件类。可以使用事件来提醒应用其他部分发生了特定的操作,为应用提供了大量的灵活性和解耦。
转自链接:https://learnku.com/laravel/t/7528/use-the-api-resource-function-of-laravel-to-build-your-api