根据Laravel 5中的路线定义常数

时间:2015-08-31 21:38:18

标签: php laravel

我们目前正在开发一个托管不同子网站的Laravel 5项目。这些单独的网站在路线中分组并共享公共前缀。例如:

Route::group(['prefix' => 'siteone', 'namespace' => 'SiteOneNamespace'], function() {
    Route::get('routeone', 'SiteOneController@index');
    Route::get('routetwo', 'SiteOneController@indextwo');
    (...)
}

Route::group(['prefix' => 'sitetwo', 'namespace' => 'SiteTwoNamespace'], function() {
    Route::get('routeone', 'SiteTwoController@index');
    Route::get('routetwo', 'SiteTwoController@indextwo');
    (...)
}

此项目中的所有站点都使用第三方库。此第三方库依赖于PHP常量进行设置。但是,并非所有子站点都具有相同的设置,因为某些设置会因每个站点而异。

所以我的问题是:有没有办法可以根据每个子站点路由的'prefix'值来定义这些常量,这些常量将在控制器中可用?

类似的东西:

$routePrefix = getRoutePrefix();

if($routePrefix == 'siteone') {
   define("LIBRARY_SETTING", "value_for_site_one");
}
elseif($routePrefix == 'sitetwo') {
   define("LIBRARY_SETTING", "value_for_site_two");
}

我知道我们可以在routes.php文件中执行此操作,但我认为必须有一个更优雅的解决方案,因为routes文件不应该是定义常量的地方。我很感激任何意见。

1 个答案:

答案 0 :(得分:1)

您可以在中间件中执行此操作:

namespace App\Http\Middleware;

use Closure;

class CreateConstant
{
    public function handle($request, Closure $next, $name, $value)
    {
        define($name, $value);

        return $next($request);
    }
}

然后在App\Http\Kernel课程中注册:

protected $routeMiddleware = [
    // other route middleware...
    'constant' => 'App\Http\Middleware\CreateConstant',
];

最后,在您的路线组中使用它:

Route::group([
    'prefix' => 'siteone',
    'namespace' => 'SiteOneNamespace',
    'middleware' => 'constant:LIBRARY_SETTING,value_1',
], function() {
    // routes
});

Route::group([
    'prefix' => 'sitetwo',
    'namespace' => 'SiteTwoNamespace',
    'middleware' => 'constant:LIBRARY_SETTING,value_2',
], function() {
    // routes
});