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
Réponse acceptée

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.