【问题标题】:Routes using annotations - passing custom variables and translation使用注释的路由 - 传递自定义变量和翻译
【发布时间】:2014-12-15 06:28:58
【问题描述】:

使用routes.php,可以很容易地使用前缀为不同语言创建路径,例如,我们可以创建关于页面路由aboutpl/o-nas 到同一路由的url:

if (\Request::segment(1) =='pl') {
    $prefix ='pl';
    \App::setLocale('pl');
}
else{
    $prefix ='';
    \App::setLocale('en');
}

Route::group(
    array('prefix' => $prefix,
    function () {
        Route::any('/'.trans('routes.about'), 'Controller@action'); 
    }
);

但是我们知道 Laravel 5 默认使用注解。是否可以使用注释来实现相同的目标?目前关于在 Laravel 5 中使用注解的信息并不多。

您可以先将RouteServiceProver添加到before方法中类似的代码:

if (\Request::segment(1) =='en') {
    $routePrefix ='';
    $this->app->setLocale('en');
}
else{
    $routePrefix ='pl';
    $this->app->setLocale('pl');
}

但是我们如何在注释本身中使用这个前缀和翻译​​以及如何在这里使用 trans 函数?它应该是这样的,但它显然不起作用,因为您不能简单地将函数放入注释中,我不知道是否有任何方法可以在此处添加前缀。

/**
 * @Get("/trans('routes.about')")
 * @prefix: {$prefix}
 */
public function about()
{
   return "about page";
}

【问题讨论】:

  • 您是否可以使用中间件,解析任何语言要求的路由 - 并在中间件中设置它,然后再到达您的控制器?
  • @TheShiftExchange 可能我可以,但目前我不知道该怎么做

标签: laravel annotations laravel-routing laravel-5 laravel-annotations


【解决方案1】:

这样的事情应该可以工作:

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Routing\Middleware;

class LangDetection implements Middleware {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->segment(1) =='en') {
              $this->app->setLocale('en');
        }
        else{
              $this->app->setLocale('pl');
        }

        return $next($request);
    }

}

然后确保在每次调用时运行 - 将其放入应用程序中间件堆栈 (app/Providers/AppServiceProvider.php):

protected $stack = [
    'App\Http\Middleware\LangDetection',
    'Illuminate\Cookie\Middleware\Guard',
    'Illuminate\Cookie\Middleware\Queue',
    'Illuminate\Session\Middleware\Reader',
    'Illuminate\Session\Middleware\Writer',
];

编辑:或者您不必将其放入堆栈中,您可以将其保留为“中间件过滤器”并在特定路由上调用它 - 就像您已经为“auth”、“csrf”等所做的一样

【讨论】:

  • 问题是这个中间件还应该修改请求(从 url 中删除前缀)并转换路由以转到正确的控制器(现在如果我有 url 'pl/o-nas` 这个中间件将设置语言正确,但它仍然会寻找 pl/o-nas 注释而不是 about)
  • 您可以在中间件中创建一个新的 $request 对象,不带前缀 - 然后将其传递给 $next($request)。如果中间件在您的主堆栈中运行,它会发生在 确定要运行哪个路由之前,因此它将选择正确的控制器
  • 能否请您展示如何根据当前 url 轻松更改 $request URL / 创建新请求对象?我以前没有做过,我不知道我该怎么做。我不知道我是否应该创建新请求或克隆当前请求并以某种方式编辑 url 以确保请求也具有方法 (POST/GET/) 和其他必要的数据。
猜你喜欢
  • 2019-11-12
  • 2015-01-14
  • 2014-01-29
  • 2018-07-16
  • 1970-01-01
  • 2021-01-03
  • 2012-01-12
  • 1970-01-01
  • 2022-06-20
相关资源
最近更新 更多