【问题标题】:Laravel always redirect certain routesLaravel 总是重定向某些路由
【发布时间】:2015-09-03 02:52:06
【问题描述】:

我目前正在编写一个工具来管理某些文章、技术文档……

每篇文章都有一个部件号,其格式始终为xxxx-xxx-xx,其中x 是一个数字。目前,我的路由设置如下:

admin/{partnumber}       (List all documentation entries)
admin/{partnumber}/new   (New documentation entry)
admin/{partnumber}/edit  (Edit the article itself)
admin/{partnumber}/{id}  (Edit the documentation with the given id for the article)

其中partnumber 必须匹配以下正则表达式:

(\d{4}-\d{3}-\d{2}|\d{9})

这是,所以我不必输入破折号。但是,为了使我的网址看起来更容易一些并更易于理解,我想自动重定向到输入的网址,但添加破折号。

example.com/admin/123456789      => example.com/admin/1234-567-89
example.com/admin/123456789/new  => example.com/admin/1234-567-89/new
...

我想我可以单独为\d{9} 创建一条路线,如下所示:

Route::get('admin/{partnumber}', 
           'ArticleAdminController@redirectWithDashes')
       ->where('partnumber', '\d{9}');

然后在该控制器的函数中执行重定向。但是,这仅适用于admin/{partnumber},不适用于任何其他路由。

我想不出任何方法来做到这一点,除了将所有路由的每个函数都设置两次,一次只是为了重定向。不过,这对我来说似乎有点冗长,不能成为解决方案。

我的另一个想法是为指定的路由创建一个中间件并重定向到路由本身,但参数不同。但在我看来,这似乎不是一个很好的中间件用例。

我错过了什么吗?这可能吗?

【问题讨论】:

  • 为什么不使用简单的.htaccess 重写这样的url?你试过了吗?
  • @Luceos 我之前没有想到这一点,但我会尝试的。如果我可以在 Laravel 本身中指定它,而无需触及 .htaccess,那就太好了。由于涉及另一个文件,我不定期检查是否更改路线,因此更容易出错。
  • 我明白,但我相信它更适合您的需求。将一个 htaccess 规则与多个路由定义进行比较 耸耸肩
  • 这就是为什么我要问是否有办法在不定义每条路线两次的情况下做到这一点。在那之前,我会遵循重写规则,谢谢:)
  • 你试过把admin/{partnumber}移到底部吗?

标签: php laravel laravel-routing


【解决方案1】:

当我绝对想在 laravel 中解决这个问题时,我会做的是创建一个中间件,例如 PartnumberMiddleware:

<?php

namespace App\Http\Middleware;

use Closure;

class PartnumberMiddleware
{
    /**
     * Run the request filter.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (preg_match('/^(?<number>[\d]{18})$/', $request->input('partnumber'), $matches) {
            $partnumberIn = preg_split('/^\d{4}\d{3}\d{2}\d{9}$/', $matches['number']);
            $partnumberMutated = implode('-', $partnumberIn);
            return redirect()->route($request->route()->getActionName(), array_merge($request->route()->parameters(), ['partnumber' => $partnumberMutated]));
        }

        return $next($request);
    }

}

未测试,您需要填写空白。但是,一旦您注册了中间件,这应该可以工作。

将突变添加到零件编号,添加从请求对象获取路由。

【讨论】:

  • @padarom 这有帮助吗?
猜你喜欢
  • 2020-11-13
  • 2016-05-26
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2020-03-24
  • 2018-07-07
  • 2017-06-19
相关资源
最近更新 更多