I kind of had same issue before,
I am using following approach for my application,
// in app.blade.php
<meta name="author" content="author name"/>
@if(isset($page['props']['event']))
<meta name="twitter:card"
content="{{ (isset($page['props']['event']['card'])) ? $page['props']['event']['card'] : 'summary' }}"/>
<meta name="twitter:site" content="@sitename"/>
<meta property="og:title"
content="{{ (isset($page['props']['event']['title'])) ? ('My Website | '.$page['props']['event']['title']) : 'My Website | Page' }}"/>
<meta property="og:description"
content="{{ (isset($page['props']['event']['description'])) ? $page['props']['event']['description'] : '' }}"/>
<meta property="og:image"
content="{{ (isset($page['props']['event']['image'])) ? $page['props']['event']['image'] : asset('/img/logo.png') }}"/>
@endif
<meta property="og:url" content="{{ url()->current() }}"/>
Now as you're using Inertia, you can pass params like following in your controller
public function inventory()
{
return inertia('Inventory', [
'event' => [
'title' => 'Inventory',
'image' => asset('images/banners/home.png'),
'description' => 'My Website - Used Car inventory'
]
]);
}
In my page view, I am passing just title
// js/pages/Inventory.vue
<template>
<Head title="My Website - Inventory" />
<Filter v-on:itemsChange="handleItemChange"/>
<List :products="ListItems"/>
</template>
this approach works for me every time, note: I am checking it here: https://cards-dev.twitter.com/validator