Laravel probleme de redirection sur ma vue

Par CMathieu-Prog, il y a 5 ans


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 .

2 réponses

Balsakup, il y a 5 ans

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
CMathieu-Prog, il y a 5 ans

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.