Missing required parameter when using injection - php

I have this route:
Route::resource('riskfields', RiskfieldsController::class)->except('show');
Within the RiskfieldController/edit I'm calling the edit view as:
public function edit(Riskfield $riskField)
{
return view('riskfields.edit', [
'riskField' => $riskField
]);
}
where Riskfield is the model.
So, inside edit.blade.php I have:
{{ Form::open(['route' => ['riskfields.update', $riskField->id], 'method' => 'put', 'autocomplete' => 'off']) }}
when I access to this endpoint: /admin/riskfields/1/edit
I get:
Missing required parameter for [Route: riskfields.update] [URI: admin/riskfields/{riskfield}] [Missing parameter: riskfield]. (View: /var/www/html/resources/views/riskfields/edit.blade.php)
The problem's that I have inject the model, so I don't know what's happening there.
This is the update method:
public function update(Riskfield $riskField, Request $request): RedirectResponse
Someone could help?
UPDATE:
dd ouput:

This problem stopped me for half an hour, but I hope my answer will help someone. Essentially I have to change this:
public function edit(Riskfield $riskField)
into:
public function edit(Riskfield $riskfield)
The parameter must have the same name convention defined within the route, so I've executed php artisan route:list and it was admin/riskfields/{riskfield}
Hope to help someone.

Related

Laravel contact form is not working correctly

I have a problem with the Laravel site's form, when I send the form through the site it shows an error, using devTools it is noted that it is an error 500 of the Post method, but the form is sent anyway.
the following error appears in the laravel log file
[2021-12-15 11:27:49] production.ERROR: Missing required parameters for [Route: contato] [URI: {lang}/contato]. {"exception":"[object] (Illuminate\Routing\Exceptions\UrlGenerationException(code: 0): Missing required parameters for [Route: contato] [URI: {lang}/contato]. at /home/corstonecom/public_html/vendor/laravel/framework/src/Illuminate/Routing/Exceptions/UrlGenerationException.php:17)
In the form view it like this:
<form id="frm-contato" class="site-form" action="{{ route('contato-enviar', app()->getLocale()) }}" method="post">
In the routes file web.php it like this:
Route::view('/contato', 'fale-conosco')->name('contato');
Route::post('/contato', 'HomeController#enviarContato')->name('contato-enviar');
and in the controller it like this:
public function enviarContato(EnviaContatoRequest $request)
{
$inputs = $request->all();
$inputs['localidade'] = $inputs['cidade'] . '/' . $inputs['uf'];
$contato = Contatos::create($inputs);
Lead::fastSave([
'name' => $inputs['nome'],
'email' => $inputs['email'],
]);
Mail::send(new FaleConosco($contato));
Session::flash('contato_enviado', 'sucesso');
return redirect()->route('contato');
}
Where am i going wrong?
You would need to pass the lang parameter when calling the route method when doing the redirect in your Controller method as the route contato requires the lang parameter:
return redirect()->route('contato', ['lang' => app()->getLocale()]);
It is best to get in the habit of using an associative array for the parameters as any more than 1 parameter and they will need to be in an associative array for the URL generator to match them up.
If you don't want to have to constantly be passing this app()->getLocale() value to the URL helpers you can set a default for the lang parameter and it will be added for you. You could use a middleware to do this. Example of the functionality of setting a default value for a parameter:
public function handle($request, $next)
{
\URL::defaults([
'lang' => app()->getLocale(),
]);
return $next($request);
}
Now you don't have to pass the parameter for lang when generating URLs as it has a default value set.
If you already have a "locale" middleware that is handling the locale you can add this to it.
When you pass parameters to the route, you should pass it as an array with keys, so that Laravel knows what the parameter is. In this case, you would do
<form id="frm-contato" class="site-form" action="{{ route('contato-enviar', ['lang' => app()->getLocale()]) }}" method="post">
See https://laravel.com/docs/8.x/routing#generating-urls-to-named-routes

Laravel - Missing required parameters for Route

I have a problem with my routes in Laravel 7 not sure where I a, going wrong here.
I have this route declaration:
Route::group(['prefix'=>'config', 'namespace'=>'Config'], static function () {
Route::resource('id-generation', 'IDSettingsController', ['names'=>'config.id_generation'])->only(['index', 'edit', 'update']);
});
Then a controller:
public function edit(IdSetting $setting)
{
return view('config.id.edit')->with(['setting'=>$setting]);
}
Then a view:
<form method="post" action="{{route('config.id_generation.update', ['id_generation'=>$setting])}}">
#method('patch')
#csrf
<x-inputs.text-input name="prefix" :model-object="$setting" />
<x-inputs.button/>
</form>
But I keep getting errors:
Illuminate\Routing\Exceptions\UrlGenerationException
Missing required parameters for [Route: config.id_generation.update] [URI: config/id-generation/{id_generation}].(View: F:\PROJECTS\PHP\app\resources\views\config\id\edit.blade.php)
In as much as I can see, I have done everything correctly. Even artisan command route:list can clearly show the route with its parameters etc.
Where might I be getting it wrong.
Surprisingly if i change it to {{url('config/id-generation/', $setting)}} everthing seeems to be working fine.
you have to match your model variable name to your ressource name, you can customize it with as:
Route::group(['prefix'=>'config', 'namespace'=>'Config'], static function () {
Route::resource('id-generation', 'IDSettingsController', ['names'=>'config.id_generation', 'as' => 'setting'])->only(['index', 'edit', 'update']);
});

Missing required parameter for Route

I am working with Laravel 5.3. I have a controller function that has $id has its argument
public function verifyMe ($id){
$user = User::findOrfail($id);
return view ('dashboard');
}
I have in my route, a url with this $id parameter.
Route::get('/verify/{id}', [
'uses' => 'UserController#verifyMe',
'as' => 'VerifyMe',
]);
Also in my blade template, I have this
<h3>To verify, Click Here. </h3>
But I get this error
Missing required parameters for [Route: verifyMe] [URI: verify/{id}].
I dont know what I am doing wrong.
In your template, remove $user->id and put auth()->user()->id and see whether it'll work.
The issue i think, is variable $user.
I had a similar problem, and tried a way like this
Try this
<h3>To verify, <a href="{{route(['verifyMe', 'id' => $user->id])}}">Click
Here.</a> </h3>
I hope it helps

Laravel form action

I'm having a hard time setting up simple links/actions.
In my index view, I have this little form that I want to launch the getTest action in the ProjectsController when I click on the button:
{{ Form::open(array('action' => array('ProjectsController#getTest', $project->id))) }}
<button type="submit"><i class="icon-arrow-up"></i></button>
{{ Form::close() }}
This is the getTest function :
public function getTest(){
echo "test";
return 'test';
}
But this keeps getting me a "Array_combine(): Both parameters should have an equal number of elements" error.
I tried making this work with a route. with this form open instead :
{{ Form::open(['method' => 'GET', 'route' => ['test_route', $project->id]]) }}
And this route :
Route::get('projects/test', array('as' => 'test_route', 'uses' =>'ProjectsController#getTest'));
But I still have the same error.
I can't find any good doc on routing/sending to actions that don't give me this problem. I don't see what
Your route doesn't need parameter, so I think this code is sufficient:
{{ Form::open(['method' => 'GET', 'route' => 'test_route']) }}
I believe the problem is you are adding parameters to the action, but you are not managing those parameters in your routes, nor is your getTest() function accepting any parameters. Another problem is you are setting your route as a GET route, but your form is going to be using POST.
It would be much easier instead on your form to use Form::hidden('id', $project->id); And then in your getTest() function, you could get the variable using $id = Input::get('id');. You'd also be able to use your route name in your form as well. Form::open(array('route'=> 'test_route', method=> 'get'));

MethodNotAllowedHttpException laravel-4

Form :
{{ Form::open(array('url' => 'user/create', 'files' => true)) }}
Route :
Route::resource('user', 'UserController');
UserController.php
class UserController extends BaseController {
public function index()
{
return 'hi11';
//return View::make('home.index');
}
public function create()
{
return 'hi22';
//return View::make('home.index');
}
}
This code gives
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
I'd just like to add my own discovery along these lines... Maybe this will save someone else the head-scratching I just performed.
I too implemented the Route::resource mechanism. I couldn't figure out why my create was working but my update was not. It turns out you can't reuse the same form code exactly, the form that does an update must use the method PUT or PATCH. Why update couldn't be a POST is beyond me.
That is to say, the opening form tag for an update must look like this:
Form::model($thing, array(
'method' => 'PUT',
'route' => array('things.update', $thing->id)
)
Without specifying method => PUT, you get this not-helpful error.
Because in your roures you use resourse controller, you can use only specific paths and actions, described in documentation http://laravel.com/docs/controllers#resource-controllers.
user/create ( UserController::create ) is where you need to show the form for adding a new user.
The actual storage of the user should be done in user/store i.e. your form must be send data to UserController::store() method.
In your case if you POST your form only to 'url' => 'user', this should automatically send data to the correct method.
Laravel 4 resources have named routes - just use those:
{{ Form::open(array('route' => 'user.create', 'files' => true)) }}
this is how I'm doing it, it might help someone, can be improved, but this would be main idea.
#if(isset($data))
{{ Form::open(['route'=>['blog.update', isset($data) ? $data->slug : null],'method' => 'patch','role' => 'form', 'class' => 'blog-form form-horizontal']) }}
#else
{{ Form::open(['route'=>'blog.store','role' => 'form', 'class' => 'blog-form form-horizontal']) }}
#endif

Categories