laravel разрывы при получении / обновлении модели с учетом часового пояса updated_at timestamp - PullRequest
0 голосов
/ 23 марта 2020

У меня есть модель с программным удалением и другим полем даты.

class BlogPost extends Model implements HasMedia
{
    use SoftDeletes, HasSlug, HasMediaTrait, HasTags, Notifiable;

    protected $dates = ['deleted_at', 'publish_date'];

    protected $casts = [
        'published' => 'boolean',
    ];

    protected $attributes = [
        'introduction' => 'Introduction',
        'content' => 'Content',
        'conclusion' => 'conclusion',
        'published' => false,
        'banner_image' => '/images/blog-banner-default.jpg',
    ];

    protected $fillable = [
        'title', 'introduction', 'content', 'conclusion', 'published', 'publish_date', 'banner_image'];

//other stuff
}

Я добавил метод контроллера, который можно использовать для всех обновлений этой модели

public function update(Request $request, BlogPost $blog)
{
    $blogData = $request->json()->all()['blog'];
    $blogPost = DB::transaction(function () use ($blog, $blogData) {
        $blog->update($blogData);
        return $blog;
    });
    return (new BlogPostResource($blogPost))->response()->setStatusCode(Response::HTTP_OK);
}

И я написал тест для определенного действия publi sh, подобного этому

public function testPublishNow()
{
    $blogPost = factory(BlogPost::class)->create();
    $updates = [
        'blog' => [
            'published' => true,
            'publish_date' => '2020-03-25 15:00:00',
        ]
    ];
    Passport::actingAs(factory(User::class)->create());
    $response = $this->putJson("/api/blogs/" . $blogPost->slug, $updates);
    $response->assertStatus(200);
    $this->assertDatabaseHas('blog_posts',['published'=>true]);
    $this->assertDatabaseHas('blog_posts',['publish_date'=>'2020-03-25 15:00:00']);
}

, который проходит без каких-либо ошибок, поэтому я предполагаю, что запрос на размещение в этом формате может быть обработан моим приложением. Однако, когда я вызываю этот метод обновления из Axios, операция завершается неудачно

publishNow() {
    let url = "/api/blogs/" + this.props.match.params.slug;
    let today = moment().startOf('minute').format("YYYY-MM-DD HH:mm:ss");
    Axios.put(url, { blog: { published: true, publish_date: today } })
        .then(() => {
            this.success();
        })
        .catch(error => {
            this.failure(error);
        });
}

Я получаю ошибку

[2020-03-23 17:46:33] local.ERROR: Trailing data {"userId":1,"exception":"[object] (InvalidArgumentException(code: 0): Trailing data at /Users/anadi/Code/adminpanel/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php:623)
[stacktrace]
#0 /Users/anadi/Code/adminpanel/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php(645): Carbon\\Carbon::rawCreateFromFormat('Y-m-d H:i:s', '2020-03-23 17:4...', NULL)
#1 /Users/anadi/Code/adminpanel/vendor/laravel/framework/src/Illuminate/Support/DateFactory.php(217): Carbon\\Carbon::createFromFormat('Y-m-d H:i:s', '2020-03-23 17:4...')
#2 /Users/anadi/Code/adminpanel/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(261): Illuminate\\Support\\DateFactory->__call('createFromForma...', Array)
#3 /Users/anadi/Code/adminpanel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(813): Illuminate\\Support\\Facades\\Facade::__callStatic('createFromForma...', Array)
#4 /Users/anadi/Code/adminpanel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(835): Illuminate\\Database\\Eloquent\\Model->asDateTime('2020-03-23 17:4...')
#5 /Users/anadi/Code/adminpanel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(1177): Illuminate\\Database\\Eloquent\\Model->fromDateTime('2020-03-23 17:4...')
#6 /Users/anadi/Code/adminpanel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(1138): Illuminate\\Database\\Eloquent\\Model->originalIsEquivalent('updated_at', '2020-03-23 17:4...')

замечаю originalIsEquivalent('updated_at', '2020-03-23 17:4...')

Я не был ' Я не сталкивался с этой проблемой, пока не использовал только временные метки, то есть

$table->timestamps();

вместо текущих

$table->timestampsTz();

, поэтому мой вопрос заключается в том, как сохранить временную зону меток времени, не нарушая работу приложения? Или, если сохранить их без часового пояса, автоматически отформатировать их в Asia/Kolkata часовой пояс при получении?

...