Laravel missing required parameters on destroy route - php

I've just created a new project something like todo list in Laravel. When I try to do simple deleting I get this error:
Missing required parameters for [Route: destroy] [URI: {}]. (View: C:...\resources\views\index.blade.php)
Here is part of code from index.blade.php:
#if($todos)
<ol>
#foreach($todos as $todo)
<li>{{ $todo->todo }}</li>
<form action="" method="post">
#csrf
#method('Delete')
x
</form>
#endforeach
</ol>
#endif
so I am just checking if there is anything, if not, then don't show list.
Part of code from controller:
public function index()
{
$todos = Todo::all();
return view('index', ['todos' => $todos]);
}
public function destroy($id)
{
Todo::findOrFail($id)->delete();
}
and line of code from web.php:
Route::resource('/', 'TodosController');
This is so basic and it is making me crazy because I can't figure out what is causing this error. Seems like everything is good.

Im not 100% certain, but try updating your resource route declaration to:
Route::resource('todos', 'TodosController');
and changing your link to
x
In the docs here, https://laravel.com/docs/5.7/controllers#restful-naming-resource-route-parameters
They describe the routes as being created like:
Actions Handled By Resource Controller
DELETE /photos/{photo} destroy photos.destroy

You don't actually submit your form. You just click on a link, so you in essence make a GET request, and not a POST request.
You need to send it through a form.
#foreach($todos as $todo)
<li>{{ $todo->todo }}</li>
<form action="{{ route('destroy', $todo->id) }}" method="POST">
#csrf
#method('DELETE')
<input type="submit" class="btn btn-danger" value="x" />
</form>
#endforeach
Having an inline form like that can appear a bit weird, so you can instead put the button outside, and submit your form on click.
#foreach($todos as $todo)
<li>
{{ $todo->todo }}
<a href="#" class="btn btn-danger"
onclick="event.preventDefault();
document.getElementById('todo-destroy-{{ $todo->id }}').submit();">x</a>
</li>
<form action="{{ route('destroy', $todo->id) }}" method="POST" id="todo-destroy-{{ $todo->id }}">
#csrf
#method('DELETE')
</form>
#endforeach

Related

How to change the boolean in DB calling a function in href?

In a Laravel context, I've got this messages page, with all the messages belonging to a specific user. Initially all messages are not readed, so I put a button to change the boolean in DB (from 0 to 1) and finally show the message.
I'm doing this:
The view
#if ($message->readed != 0)
<p class="card-text message text-left">{{ $message->message }}</p>
#else
<form method="POST" action="/message/read">
#csrf
#method('PATCH')
<input type="hidden" name="message" value="{{ $message->id }}"/>
<button class="btn btn-info text-white" type="submit">
Leggi
</button>
</form>
#endif
The route in web.php
Route::patch('message/read', 'MusicianController#readMessage');
The function
public function readMessage(Request $request)
{
$message = Message::where('id', $request->id)->first();
$message->readed = 1;
$message->update();
return redirect()->back()->with('message', 'message updated');
}
But it's not working, as soon as I click the button to show the message (and even change the DB value) I've got this error: The PATCH method is not supported for this route. Supported methods: GET, HEAD.
Even if I had specified a patch method in routes and even in the form with #method('PATCH')
Could someone help me understand what's wrong please??
the main answer
your route is:
Route::patch('message/read', 'MusicianController#readMessage');
replace your route with following route that use for all CRUD opration:
Route::resource('message/read', 'MusicianController');
if you use ajax for submit data then replace your type and url with following:
type: "patch",
url: "{{url('message/read')}}",
if you don't use ajax than use following:
<form method="POST" action="{{url('message/read"')}}">
{{csrf_field()}}
{{ method_field('PATCH') }}
</form>
update: after version 5.6 you can use these syntax for above functions in any blade file:
<form method="POST" action="{{url('message/read"')}}">
#csrf
#method('PATCH')
</form>

Resource route call to wrong method

I have created route with "resource". When I try to use delete method it always going to show method.
Route list
Route call
<a class="btn btn-danger" href="{{ route('languages.destroy', ['language' => $language->id]) }}">Delete</a>
Delete method
public function destroy($language){
$lang = Language::findOrFail($language);
$lang->delete();
session()->flash('flash_message', 'The language has been
removed!');
return redirect(route('languages.index'));
}
So how to fix it?
Thank you!
Since it goes to GET method because you are not deleting using form .
route('languages.destroy',['language' => $language->id])
the above route only generate url .so if you are using
delete
then it treat as get method.So you have to use
<form method="POST" action="{{ route('languages.destroy',['language' => $language->id]) }}">
#csrf
#method("delete")
<button type="submit">Delete</button>
</form>
In your blade:
<form action="{{ route('languages.destroy',$language->id) }}" method="POST">
#csrf
#method('DELETE')
<button type="submit" class="btn btn-danger">Delete</button>
</form>

Button Call to controller function / method

I am using Laravel 7 and am stuck on trying to initiate a Controller method via a button in my view. I am using a form with a simple a tag but am not sure if how I am going about it is the best way. Besides, I am getting an error withe the way I am attempting it. The error is:
Too few arguments to function App\Http\Controllers\TasksController::finished(), 1 passed in C:\laragon\www\taskapp\vendor\laravel\framework\src\Illuminate\Routing\Controller.php on line 54 and exactly 2 expected
I am truly stumped on how to call a method from a button click. What I am trying to do is (when the button is clicked) change the status of an item in my db called $task->task_status to "Complete".
In my table in the home view, I have a form like this:
<td>
<form method="POST" action="/tasks/{{$task->id}}">
{{ csrf_field() }}
{{ method_field('POST') }}
<div class="ml-5">
<i class="fa fa-check"></i>
</div>
</td>
In my web.php, I have:
Route::get('/finished/{id}', 'TasksController#finished')->name('finished');
And in my TasksController, I have the following:
public function finished(Request $request, $id) {
$task = Task::find($id);
dd($task);
$task->task_status = $request['task_status'] = 'Completed';
$task->save();
return redirect('home')->with('success', 'Task Completed and now viewable in Completed Tasks!');
}
If anyone can show me a better way of accomplishing this (without using axaj) I would really appreciate it.
Thank you in advance.
I ended up fixing this in using the following code:
in my web.php, I used:
Route::get('/finished/{id}', 'TasksController#finished');
in my home.blade.php, I have:
<td>
<form action="finished/{{$task->id}}" method="GET" style="display: inline" class="">
#csrf
#method('POST')
<div class="ml-5">
<button type="submit" class="btn btn-sm btn-success">
<i class="fa fa-check"></i>
</button>
</div>
</form>
</td>
And in my TasksController, I pretty much left that the way it was and it now works.

Laravel Delete Method: MethodNotAllowedHttpException in RouteCollection.php line 233:

I tried to delete the cart from a list. When I tried to delete it, it shows an Error. Below here is my code:
Web.php
Route::post('cart/delete/{id}','ProductController#deleteCart');
blade.php
<a href="{{ url('/cart/delete',$row->id) }}" class="remove_item">
<i class="fa fa-times"></i>
</a>
<form action="{{ url('/cart/delete',$row->id)}}" method="POST" style="display: none;">
{!! Form::hidden('id',$row->id) !!}
</form>
Controller.php
public function deleteCart($id){
$cart = Cart::find($id);
$cart->destroy();
return Redirect::to('/shop-cart');
}
Simply change the following line of code:
Route::post('cart/delete/{id}','ProductController#deleteCart');
into:
Route::get('cart/delete/{id}','ProductController#deleteCart');
Reason for this error is sending a GET request to a POST route. In your code you are sending a GET request by calling a URL.
<a href="{{ url('/cart/delete',$row->id) }}" class="remove_item">
<i class="fa fa-times"></i>
</a>
Or otherwise if you want to keep the route as it is (as a POST route) just use the following code and make some adjustments accordingly:
<form action="{{ url('/cart/delete') }}" method="POST" style="display: none;">
{!! Form::hidden('id', $row->id) !!}
<input type="submit" value="Submit">
</form>
And it is better to modify the route as follows as the '/{id}' part is not needed as we are sending the id along with the POST request:
Route::post('cart/delete','ProductController#deleteCart');
Import Http\Request into your controller using:
use Illuminate\Http\Request;
And update your controller function as follows:
public function deleteCart(Request $request){
$cart = Cart::find($request['id']);
$cart->destroy();
return Redirect::to('/shop-cart');
}
But for this scenario GET route seems a good choice to avoid complexity.
Remove a href link, because it will send GET request, instead of POST. Add submit button to the form:
<form action="{{ url('/cart/delete/'.$row->id) }}" method="POST" style="display: none;">
{!! Form::hidden('id', $row->id) !!}
{!! Form::submit('delete') !!}
</form>
The error say that there is no route like the one you try to call. you have a route like this in your route file : /cart/delete/{id} where expects an id, and you call this from your form /cart/delete?id=theid
Fix
Change this from your submit url : /cart/delete',$row->id)
To this: /cart/delete/{{$row->id}}

Page Not Found in Laravel

Code in my Route file look like this :
Route::delete('/subtask1/delete/{{subtask}}', 'TaskController#subtaskdestroy');
Route::get('/home', 'HomeController#index');
Route::get('/redirect/{provider}', 'SocialAuthController#redirect');
Route::get('/callback/{provider}', 'SocialAuthController#callback');
});
Code in view file:
<form action="/subtask1/delete/{{1}}" method="POST" style="display: inline-block;">
{{ csrf_field() }}
{{ method_field('DELETE') }}
<button type="submit" id="delete-task-{{$subtask->id }}" class="btn btn-danger btn-xs">
<i class="fa fa-btn fa-trash"></i>Delete
</button>
</form>
And code on the Controller:
public function subtaskdestroy(Request $request, Subtask $subtask)
{
$this->authorize('checkTaskOwner', $subtask);
$subtask->delete();
return redirect('/tasks');
}
With this code, I am getting an error like this:
Sorry, the page you are looking for could not be found.
NotFoundHttpException in RouteCollection.php line 161:
You mistake when defined route for delete. It should be like this:
Route::delete('/subtask1/delete/{subtask}', 'TaskController#subtaskdestroy');
But you given:
Route::delete('/subtask1/delete/{{subtask}}', 'TaskController#subtaskdestroy');
More about Route Parameters:
Laravel Route Parameters
You used return redirect('/tasks'); in your controller. With this line the page will redirecte to route /tasks after successfully delete the data. Make sure you have /tasks route in your route file. Example:
Route::get('/tasks','YourController#method');

Categories