教程 > laravel 教程 > 阅读:200

laravel 生成 url——迹忆客-ag捕鱼王app官网

简介

laravel提供了一些函数来帮助我们为应用程序生成url。当在模板和api响应中构建链接,或生成指向应用程序另一部分的重定向响应时,这些方法非常有用。


基础知识

生成基本的url

url帮助函数可用于为我们的应用程序生成任意url。生成的url将从当前的请求中自动获取协议(http或https)和host:

$post = app\post::find(1);
echo ;
// http://example.com/posts/1

访问当前url

如果没有给url函数传一个路径参数,则返回一个illuminate\routing\urlgenerator实例,使的我们可以访问有关当前url的信息:

// get the current url without the query string...
echo ->current();
// get the current url including the query string...
echo ->full();
// get the full url for the previous request...
echo ->previous();

上面这些方法也可以通过url facade 调用

use illuminate\support\facades\url;
echo url::current();

给命名路由生成url

route函数可以通过命名路由的名称生成url。使用路由的名称可以使得路由和生成的url之间解耦合。因为,如果路由的url更改,则无需对route函数调用进行任何更改。例如,假设我们应用程序包含如下定义的路由:

route::get('/post/{post}', function () {
    //
})->name('post.show');

要生成此路由的url,可以使用下面的方法

echo route('post.show', ['post' => 1]);
// http://example.com/post/1

我们经常使用eloquent模型的主键生成url 。因此,可以将eloquent模型作为参数值传递给route函数。route将自动提取模型的主键:

echo route('post.show', ['post' => $post]);

route帮助函数还可用于为具有多个参数的路由生成url:

route::get('/post/{post}/comment/{comment}', function () {
    //
})->name('comment.show');
echo route('comment.show', ['post' => 1, 'comment' => 3]);
// http://example.com/post/1/comment/3

签名网址

laravel使我们可以轻松地为命名路由创建“签名” url。这些url在query string后附加一个哈希值作为“签名”,这使得laravel可以验证url自创建以来是否被修改。签名的url对于那些可公开访问的url,但是需要防止被篡改特别有用。

例如,我们可以使用签名的url来实现通过电子邮件发送给客户的公共“unsubscribe”链接。要创建命名路由的签名url,可以使用url facade的signedroute方法:

use illuminate\support\facades\url;
return url::signedroute('unsubscribe', ['user' => 1]);

如果我们想生成一个有过期时间的临时签名路由url,则可以使用以下temporarysignedroute方法:

use illuminate\support\facades\url;
return url::temporarysignedroute(
    'unsubscribe', now()->addminutes(30), ['user' => 1]
);

验证签名的路由请求

要验证请求具有有效签名,应该在传入请求上调用request 的hasvalidsignature方法:

use illuminate\http\request;
route::get('/unsubscribe/{user}', function (request $request) {
    if (! $request->hasvalidsignature()) {
        abort(401);
    }
    // ...
})->name('unsubscribe');

或者,我们可以将illuminate\routing\middleware\validatesignature中间件分配给路由。如果尚不存在,则应在http kernel 的routemiddleware数组中为该中间件分配一个键名:

/**
 * the application's route middleware.
 *
 * these middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routemiddleware = [
    'signed' => \illuminate\routing\middleware\validatesignature::class,
];

一旦在内核中注册了中间件,就可以将其附加到路由上。如果传入的请求没有有效的签名,则中间件将自动返回403错误响应:

route::post('/unsubscribe/{user}', function (request $request) {
    // ...
})->name('unsubscribe')->middleware('signed');

为控制的方法生成url

action函数为给定的控制器动作生成一个url。我们不需要传递控制器的完整命名空间。而是传递在app\http\controllers命名空间下的控制器类名称:

$url = action('homecontroller@index');

我们还可以使用下面这种数组的形式调用action

use app\http\controllers\homecontroller;
$url = action([homecontroller::class, 'index']);

如果控制器的方法接受路由参数,则可以将它们作为第二个参数传递给action

$url = action('usercontroller@profile', ['id' => 1]);

默认值

对于某些应用程序,我们可能希望为某些url参数指定请求范围的默认值。例如,假设我们的许多路由都定义了一个{locale}参数:

route::get('/{locale}/posts', function () {
    //
})->name('post.index');

每次调用route帮助函数时总是要传递locale是很麻烦的。因此,可以使用url::defaults方法来定义此参数的默认值,该默认值将始终在当前请求期间应用。我们可能希望从路由中间件中调用此方法,以便可以访问当前请求:

 $request->user()->locale]);
        return $next($request);
    }
}

为locale参数设置默认值后,通过route帮助函数生成url时,不再需要传递其值。

查看笔记

扫码一下
查看教程更方便
网站地图