如何在路由参数中使用“ OR”?

时间:2019-03-27 14:52:32

标签: laravel laravel-routing

我正在建立一个类似Twitter的网站,但路由遇到问题:

  1. 此代码会将用户带到具有给定 id 的用户的个人资料页面。

Route::get('/profile/{id}', 'ProfileController@show')->name('profile.show');

  1. 此代码会将用户转到具有给定用户名的用户的个人资料页面。

Route::get('/profile/{username}', 'ProfileController@show')->name('profile.show');

  1. 最后,此代码将使用户进入具有给定电子邮件的人的个人资料页面。

Route::get('/profile/{email}', 'ProfileController@show')->name('profile.show');

我的意思是所有这三个URL将向用户显示同一页面:

example.com/profile/1 example.com/profile/rahimi0151 example.com/profile/rahimi0151@gmail.com

我的问题是: 有没有办法合并所有这些路线?如下所示:

Route::get('/profile/{id|username|email}', 'ProfileController@show')->name('profile.show');

1 个答案:

答案 0 :(得分:1)

我不确定要合并路线,但是可以这样写路线

Route::get('/profile/{identifier}', 'ProfileController@show')->name('profile.show');

然后将showProfileController的方法签名更改为类似的

public function show($identifier) {
    if (is_numeric($identifier)) {
        // do something
    } else if ($this->isEmail($identifier)) {
        // do something
    } else {
        // assume it is a username, and do something with that
    }
}

// method to check if value provided is an email
// preferably, move this to a file of your custom helper functions
private function isEmail($value) {
    // check if value is an email 
    // and return true/false indicating whether value is an email
}

这是link的一个很好的方法,用于检查值是否为有效的电子邮件地址