На сайте Laravel/Livewire я пытаюсь использовать внедрение зависимостей для определения класса обслуживания для чтения записи ключей/значений.
Я определил 2 класса: app/Library/Services/Interfaces/KeyDataInterface.php:
<?php
namespace App\Library\Services\Interfaces;
use App\Models\KeyData;
/**
* Write/read key value into/from storage
*/
interface KeyDataInterface
{
/**
* Write key/value into storage
*
* @param string $key
* @param string $value
* @param int $durationInSeconds
*
* @return KeyData - created model
*/
public static function write( string $key, string $value, int $durationInSeconds = 60 ): KeyData;
}
и реализация в app/Library/Services/KeyDataInDbService.php:
<?php
namespace App\Library\Services;
use App\Library\Services\Interfaces\KeyDataInterface;
use App\Models\KeyData;
use Carbon\Carbon;
/**
* Write/read key value into/from db
*
*/
readonly class KeyDataInDbService implements KeyDataInterface
{
/**
* Write key/value into db
*
* @param string $key
* @param string $value
* @param int $durationInSeconds
*
* @return KeyData - created model
*/
public static function write( string $key, string $value, int $durationInSeconds = 60 ): KeyData {
$keyData = KeyData::getByKey($key)->getByValue($value)->first();
// scopeGetByValue
if (!empty($keyData)) {
$keyData->expired_at = Carbon::now('UTC')
->addSeconds($durationInSeconds);
return $keyData;
}
return KeyData::create([
'key' => $key,
'value' => $value,
'expired_at' => Carbon::now('UTC')->addSeconds($durationInSeconds)
]);
}
}
Я связал их в app/Providers/AppServiceProvider.php:
public function register(): void
{
$this->app->bind(
'App\Library\Services\Interfaces\KeyDataInterface',
'App\Library\Services\KeyDataInDbService'
);
}
Но когда я попытался использовать компонент Livewire:
class TheTaskIsViewed extends Component
{
...
public KeyDataInterface $keyDataService;
public function boot(KeyDataInterface $keyDataService)
{
$this->keyDataService = $keyDataService;
}
public function mount(int $taskId)
{
Я получил ошибку:
Property type not supported in Livewire for property: [{}]
В браузере я вижу указание на 12 строку файла, в котором всего 8 строк:
Компонент TheTaskIsViewed используется в resources/views/livewire/test.blade.php как:
<div class = "admin_page_container" id = "app_image_admin_page_container pt-64" x-cloak>
<fieldset class = "p-1 m-1 mb-6 bordered">
<legend class = "bordered">
the-task-is-viewed
</legend>
<livewire:admin.the-task-is-viewed taskId = "5"/>
</fieldset>
</div>
Почему у меня возникла эта ошибка и как ее исправить?
"laravel/framework": "^10.48.4",
"livewire/livewire": "^3.4.9",
В общедоступных свойствах Livewire поддерживаются только некоторые типы. https://livewire.laravel.com/docs/properties#supported-property-types
Если вы не используете $keyDataService
в представлении, сделайте его приватным или защищенным.
protected KeyDataInterface $keyDataService;
Если вы хотите использовать $keyDataService
в представлениях, создайте собственный тип.