搜索

首页  >  问答  >  正文

Laravel 8 - 如何将 /{editable_text} 路由重定向到 /{user} 路由

我一直在尝试创建重定向路由来引导我访问用户个人资料。重定向路由应该是来自用户数据库的字符串/文本,并且应该重定向到相同的用户个人资料页面。

例如,假设我的 user1 有名为“editable_link”的列,其值为“abcd123”,并且可以通过路由“www.mywebsite.com/user1”访问配置文件,因此当有人访问“www.mywebsite.com/”时abcd123”,它应该将他重定向到“www.mywebsite.com/user1”。

我尝试了很多方法,但没有任何方法对我有用,因为我是编码新手。有人可以给我一些最好的解决方案吗?

这是我的 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');

这就是我想要创建的:

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

我可以发布您需要的任何其他代码,谢谢。

P粉986028039P粉986028039263 天前639

全部回复(1)我来回复

  • P粉041856955

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

    您必须首先检查数据库中是否存在包含 editable_link 值的路由。那么你就不能在路由定义中执行此操作,因为那里的数据库尚未准备好。

    当然,您可以选择通过数据库可用的地方(例如控制器或中间件)来检查是否存在。

    让路由只有这一条

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

    然后在 UserController show 方法中,您必须创建条件,例如 example

    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();
    }

    或者,您可以创建一个也包含上述条件的中间件。

    回复
    0
  • 取消回复