Bonjour,
Je suis actuellement en train de faire le TP de la redirection d'URL du tutoriel de Laravel, cependant je n'arrive pas à comprendre pourquoi lorsque je veux rediriger un lien de ma vue vers mon controller avec la method action(), il ne trouve pas mon controller. Aurais-je louper quelque chose ?
Mon controller :
<?php
namespace App\Http\Controllers;
use App\Models\Link;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class LinkController extends Controller
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function main()
{
return view('link',['title'=>'URL']);
}
public function store()
{
$lien = $this->request->input('url');
$link = Link::firstOrCreate(['url'=>$lien]);
return view('linkSuccess',compact('link'));
}
public function show(int $id)
{
$link =Link::findOrFail($id);
return new RedirectResponse($link->url);
}
}
Ma vue :
@section('content')
<h1>bravo</h1>
<p><a class="btn btn-primary" href='{{ action([LinkController::class,'show'],['id'=> $link->id]) }}'>
Lien : {{ action(
[LinkController::class,'show'],['id'=> $link->id])
}}
</a></p>
@endsection
Il me renvois ' Action LinkController@show not defined. ' sa doit etre un peu bête mais je ne trouve pas le soucis :
https://laravel.com/docs/8.x/urls#urls-for-controller-actions
Merci d'avance pour vos réponses .
Salut,
Il faut que ta route soit déclarée dans le fichier routes/web.php
(exemple: Route::get('links/{id}, [LinkController::class, 'show']);
).
Le mieux est d'utiliser des routes nommées (petit tips, tu peux utiliser l'auto binding, ça eviter de faire Link::findOrFail($id)
).
Voilà la solution que je te propose
routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LinkController;
Route::get('links/{link}', [LinkController::class, 'show'])->name('link.show');
app/Http/Controllers/LinkController.php
<?php
namespace App\Http\Controllers;
use App\Models\Link;
use Illuminate\Http\RedirectResponse;
class LinkController extends Controller {
/**
* Auto binding de Link, il va récupérer le model si il existe, sinon 404
* Equivalent au `findOrFail`
*/
public function show(Link $link)
{
return redirect($link->url);
}
}
Ta vue
@section('content')
<h1>bravo</h1>
<p>
<a class="btn btn-primary" href="{{ route('link.show', ['link' => $link']) }}">
Lien : {{ route('link.show', ['link' => $link']) }}
</a>
</p>
@endsection
Bonjour,
Merci beaucoup pour ton retour.
Effectivement, j'ai continuer le reste du tutoriel ça marche niquel avec le nommage des routes . Je pense que c'est plus logique et ordonné de faire une redirection vers une Route plutôt que directement vers une fonction d'un controlleur, peut-être que Laravel deviens plus stricte au fur et à mesure des versions je ne sais pas :).
Merci encore.