Описываю метод destroy класса TasksController: Написал вот такую функцию:
public function destroy ($id) {
$task = Task::find($id);
$task->delete();
return redirect()->route('tasks.index');
}
find() не работает и если навести на него мышь, то пишет, что method find not found in App\Task.
Полный код контроллера:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Task;
class TasksController extends Controller
{
public function index () {
$tasks = Task::getAllTasks();
return view('tasks.index', compact('tasks'));
}
public function create () {
return view('create');
}
public function store (Request $request) {
$task = new Task;
$task->fill($request->all());
$task->save();
return redirect()->route('tasks.index');
}
public function destroy ($id) {
$task = Task::find($id);
$task->delete();
return redirect()->route('tasks.index');
}
}
Очень много искал в интернете, но конкретных ответов не нашёл, в том числе на stackoverflow(eng). Пишут, что возможно я подключил что-то не так, но я не вижу ошибки. Направьте пожалуйста в нужную сторону.
Код используемой модели Task:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
protected $fillable = ['body', 'id'];
public static function getAllTasks () {
return self::all();
}
}
Самое странное, что методы fill(), save(), all() работают нормально.
Вношу дополнения. С момента начала вопроса нашёл такой интересный момент:
public function destroy ($id) {
$task = Task::all()->find($id)->delete();
return redirect()->route('tasks.index');
}
В таком случае find() успешно срабатывает, delete() срабатывает как нужно, но всё же подсвечивает unhandled\exception.
Можно ли при таком подходе считать вопрос закрытым?
Выполнить действия:
App\Task
наследует класс Illuminate\Database\Eloquent\Model
destroy
метод так:public function destroy ($id) {
/** @var App\Task $task */
$task = Task::find($id);
$task->delete();
// зачем тебе показывать страницы задачи? Ты же ее удалил.
//return view('tasks.show', compact('task'));
// лучше сделай редирект на страницу списка задач
// тут будет работать, если у твоего ресурсного машрута имя `tasks`
return redirect()->route('tasks.index');
}
composer dumpautoload
Проблема кроется в самом фреймворке, он почему-то не обнаруживает некоторые методы.
Решил проблему с помощью _ide_helper. Ссылка на источник решения, вопрос менее конкретный(обобщённый), но решение подходит: https://stackoverflow.com/questions/29439753/eloquent-orm-code-hinting-in-phpstorm
Решение: Написать в консоли в корне проекта - "php artisan ide-helper:models"
Попробуйте такой вариант
public function destroy ($id) {
$task = new Task();
$result = $task->find($id);
.....
}
public function destroy ($id) {
$task = Task::all()->find($id)->delete();
return redirect()->route('tasks.index');
}
Не корректный подход к удалению. В данном случае вы вытаскиваете ВСЕ задачи, а дальше работаете с коллекцией (то есть ищете первый подходящий по id)
Воспользуйтесь методом destroy
или delete
напрямую, чтобы не выбирать эту модель
public function destroy ($id) {
$task = Task::destroy($id);
return redirect()->route('tasks.index');
}
// or
public function destroy ($id) {
$task = Task::where('id',$id)->delete(); // запрос будет работать сразу на удаление, вместо 2-х запросов(find и delete), будет 1 (delete)
return redirect()->route('tasks.index');
}
А по поводу того, что пишет про неизвестный метод - это, как писали выше, проблема ide. Она решается путём подключения всех фасадов, но при этом возникали (лично у меня) другие проблемы. Поэтому не можно не обращать на это внимание. Они прекрасно работают.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Прошу помочь с задачей: есть цикл, в котором выводяться личные сообщения, юзера с его рефером (собеседником)
есть скрипт проверяющий на валидацию, он рабочий, но нужно изменить язык, в папке system/language присутствует только английский язык