使用注释的路由 - 传递自定义变量和转换

时间:2014-10-20 09:54:27

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

使用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";
}

1 个答案:

答案 0 :(得分:0)

这样的事情应该有效:

<?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',
];

编辑:或者您不必将其放入堆栈,您可以将其作为中间件过滤器&#39;并且只需在特定路线上拨打电话 - 就像您已经为&#39; auth&#39;,&#39; csrf&#39;等