Maison  >  Questions et réponses  >  le corps du texte

Laravel 8 - Comment rediriger la route /{editable_text} vers la route /{user}

J'ai essayé de créer un itinéraire de redirection qui me mène à un profil utilisateur. L'itinéraire de redirection doit être une chaîne/texte provenant de la base de données utilisateur et doit rediriger vers la même page de profil utilisateur.

Par exemple, disons que mon utilisateur1 a une colonne appelée "editable_link" avec une valeur de "abcd123" et peut accéder au profil via l'itinéraire "www.mywebsite.com/user1", donc quand quelqu'un visite "www.mywebsite.com / "abcd123", cela devrait le rediriger vers "www.mywebsite.com/user1"

J'ai essayé de nombreuses façons mais rien n'a fonctionné pour moi car je suis nouveau dans le codage. Quelqu'un peut-il me donner la meilleure solution ?

Voici ce qu'il y a dans mon web.php :

<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\UserController;
use App\Http\Controllers\VisitController;
use App\Http\Controllers\LinkController;
use Illuminate\Auth\Events\Verified;

Route::get('/', function () {
    return view('welcome');
});
Route::get('/verified', function () {
    return view('verified');
});

Auth::routes(['verify' => true]);

Route::group(['middleware' => 'auth', 'prefix' => 'dashboard', ], function() {

    Route::get('/links', [LinkController::class, 'index']);
    Route::get('/links/new', [LinkController::class, 'create'])->middleware('verified');
    Route::post('/links/new', [LinkController::class, 'store']);
    Route::get('/links/{link}', [LinkController::class, 'edit']);
    Route::post('/links/{link}', [LinkController::class, 'update']);
    Route::delete('/links/{link}', [LinkController::class, 'destroy']);
    Route::get('/qr', [LinkController::class, 'qr']);

    Route::get('/settings', [UserController::class, 'settings']);
    Route::get('/settings/edit', [UserController::class, 'edit']);
    Route::get('/settings/profile', [UserController::class, 'profile']);
    Route::get('/settings/help', [UserController::class, 'help']);
    Route::post('/settings/edit', [UserController::class, 'update']);
    Route::post('/settings/profile', [UserController::class, 'update_avatar']);

});

Route::post('/visit/{link}', [VisitController::class, 'store']);
Route::get('/{user}', [UserController::class, 'show'])->name('show');

Voici ce que je veux créer :

Route::get('/qr/{editable_link}', function () {
    return redirect('{user}');
Route::get('/{user}', [UserController::class, 'show'])->name('show');
});

Je peux publier tout autre code dont vous avez besoin, merci.

P粉986028039P粉986028039211 Il y a quelques jours507

répondre à tous(1)je répondrai

  • P粉041856955

    P粉0418569552024-04-07 11:20:34

    Vous devez d'abord vérifier si une route contenant la valeur editable_link existe dans la base de données. Ensuite, vous ne pouvez pas le faire dans la définition de l'itinéraire car la base de données n'y est pas encore prête.

    Bien sûr, vous pouvez choisir de vérifier l'existence via l'endroit où la base de données est disponible (comme un contrôleur ou un middleware).

    Qu'il n'y ait que cette route

    Route::get('/{user}', [UserController::class, 'show'])->name('show');

    Ensuite, dans la méthode UserController show, vous devez créer la condition comme exemple

    public function show($user)
    {
        // checks if $user parameter is an editable_link that exist in db
        $userWithEditableLink = User::where('editable_link', $user)->first();
        
        // redirect if above exist to the same route but with, for example, username
        if ($userWithEditableLink) {
            return redirect($userWithEditableLink->username);
        }
        
        // do something as, such as
        // $user = User::where('username', $user)->firstOrFail();
    }

    Vous pouvez également créer un middleware qui contient également les conditions ci-dessus.

    répondre
    0
  • Annulerrépondre