Я пытаюсь выполнить CRUD с помощью livewire, и у меня возникают некоторые проблемы.
Здесь вы можете увидеть мой основной компонент контроллера.
class Topics extends Component
{
public function index()
{
$topics = Topic::all();
return view('topics.index', ['topics'=>$topics]);
}
public function create()
{
return view('topics.create');
} /* The store function is in a single component as I say after */
public function show(Topic $topic)
{
return view('topics.show', compact('topic'));
}
public function edit(Topic $topic)
{
return view('topics.edit', compact('topic'));
}
public function destroy(Topic $topic)
{
//
}
public function render()
{
return view('livewire.topics');
}
}
В начале я бы попробовал перегруппировать все функции CRUD в один файл livewire. Но у меня не было возможности использовать функцию магазина. Мне нужно было создать компонент только для хранения. Может быть, у вас есть решение и для этого? Но это не моя главная проблема здесь.
В качестве функции сохранения функция обновления не работает, поэтому я создал компонент с именем «редактировать».
Вот в чем проблема.
Я могу :
Я не могу передать этому компоненту информацию о теме, на которую я нажал.
Переменная $topic не имеет знака.
Как, по-вашему, я могу передать этому компоненту информацию темы, которую я хочу отредактировать?
Я поместил здесь остальную часть моего фактического представления и контроллера.
Компонент магазина:
class Store extends Component
{
protected $rules = [
'title' => 'required',
'content' => 'required',
];
public $title;
public $content;
public $user_id;
public function store()
{
$this->user_id = auth()->user()->id;
$this->validate();
$topic = Topic::create([
'title' => $this->title,
'content' => $this->content,
'user_id' => $this->user_id,
]);
return redirect()->route('topics.show', $topic->id);
}
public function render()
{
return view('livewire.test');
}
}
Компонент контроллера редактирования:
class Edit extends Topics
{
public function render()
{
return view('topics.edit');
}
}
Как видите, я попытался расширить контроллер Topics для передачи $topic... но это, конечно, не сработало.
Я попытался:
<div>
<livewire:edit :topic = "$topic">
</div>
И еще кое-что.
Спасибо за помощь мне





Вам нужно определить функцию монтирования в вашем Livewire:
class Store extends Component
{
protected $rules = [ ... ];
public $topic = NULL;
public function mount($topic) {
$this->topic = $topic
}
В компонентах Livewire вы используете mount() вместо конструктора класса __construct(), к которому вы, возможно, привыкли. NB: mount() вызывается только при первом монтировании компонента и не будет вызываться снова, даже когда компонент обновляется или перерисовывается.
Кроме того, в вашем случае, если вы разделяете модель View таким образом, вы могли бы также подумать о том, чтобы Livewire инициировался отдельно. поэтому в Store также добавьте $listener, а затем используйте javascript для загрузки Livewire... но это совсем другой вопрос и другой ответ.
Спасибо за ваш ответ. Для слушателя, пока мне это не нужно, но я держу это в уме. Еще раз спасибо :)