Laravel 文档阅读:生成 URL

翻译、衍生自:https://learnku.com/docs/laravel/5.5/urls

简介

Laravel 提供了几个生成 URL 地址的辅助函数,包括:urlrouteaction。它们的主要作用是:在 Blade 模板中构建链接、构建 API 响应或者构建重定向到应用程序其他部分的响应。

基础

生成基础 URLs

url 辅助函数是生成 URL 的最基础方法。生成的 URL 会自动添加 Scheme(HTTP 或者 HTTPS)和主机地址,这些信息都是从当前请求里获得的:

$post = App\Post::find(1);

echo url("/posts/{$post->id}");

// http://example.com/posts/1

获得当前 URL

如果使用 url 函数时,没有提供参数,那么 url() 会返回一个 Illuminate\Routing\UrlGenerator 实例,从中可以获得当前 URL 相关的信息:

// Get the current URL without the query string...
echo url()->current();

// Get the current URL including the query string...
echo url()->full();

// Get the full URL for the previous request...
echo url()->previous();

这些方法就还可以通过 URL 门面访问到:

use Illuminate\Support\Facades\URL;

echo URL::current();

命名路由 URLs

route 辅助函数可以用来生成到指定命名路由的 URL。使用命名路径生成 URL 的方式不与路由的实际 URL 耦合。所以,如果路由 URL 改变后,使用 route 函数调用的地方不需要任何修改。例如,应用程序里定义了这么一个路由:

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

下面,我们使用 route 函数生成到该命名路由的 URL:

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

// http://example.com/posts/1

如果你经常在生成 URL 的时候,使用 Eloquent Model 的主键。这样的话,你可以直接把 Eloquent Model 作为参数值传递给 route 函数,route 函数会自动解析出 Model 的主键值。

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

控制器 Action URLs

action 方法通过指定控制器 action 来生成访问的 URL。你无需传递具有完整命名空间的控制类名,只要传递相对于 App\Http\Controllers 这个命名空间后面的部分即可:

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

如果控制器方法接受路由参数,你可以通过第二个参数传递过去:

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

默认值

对于某些应用程序,你可能希望为某些 URL 参数指定请求范围级别的默认值。假设在你的许多路由中,包含一个 {locale} 参数。

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

每次调用 route 函数的时候,都要传递这个 locale 参数会很麻烦。对于这种情况呢,你可以使用 URL::defaults 方法为这个参数指定默认值,它会在当前请求里总是生效。为了方便,你也可以创建一个中间件,在中间件中调用这个方法,然后让相关路由/路由组使用这个中间件。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetDefaultLocaleForUrls
{
    public function handle($request, Closure $next)
    {
        URL::defaults(['locale' => $request->user()->locale]);

        return $next($request);
    }
}

locale 参数的默认值设定好后,通过 route 辅助函数生成 URL 的时候,就无需为 locale 传递值了。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1
//路由命名还可以这样
Route::get('/', ['as' => 'home.index', 'uses' => 'HomeController@index']);
6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!