Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以在Laravel的路由组中对多个域进行分组吗?_Php_Laravel_Routing_Laravel Routing - Fatal编程技术网

Php 我可以在Laravel的路由组中对多个域进行分组吗?

Php 我可以在Laravel的路由组中对多个域进行分组吗?,php,laravel,routing,laravel-routing,Php,Laravel,Routing,Laravel Routing,假设我有以下几点: Route::group(array('domain' => array('admin.example.com')), function() { ... }); Route::group(array('domain' => array('app.example.com')), function() { ... }); Route::group(array('domain' => array('dev.app.example.com')),

假设我有以下几点:

Route::group(array('domain' => array('admin.example.com')), function()
{
    ...
});

Route::group(array('domain' => array('app.example.com')), function()
{
    ...
});

Route::group(array('domain' => array('dev.app.example.com')), function()
{
    ...
});
有没有办法让多个域共享一个路由组?比如:

Route::group(array('domain' => array('dev.app.example.com','app.example.com')), function()
{
    ...
});

目前你不能。我也有同样的“问题”;我的解决办法是用foreach在你的子域中循环并注册路由。

Laravel似乎不支持这一点

我不知道为什么我没有更早地想到这一点,但我想一个解决方案是在一个单独的函数中声明路由,并将其传递给两个路由组

Route::group(array('domain' => 'admin.example.com'), function()
{
    ...
});

$appRoutes = function() {
    Route::get('/',function(){
        ...
    }); 
};

Route::group(array('domain' => 'app.example.com'), $appRoutes);
Route::group(array('domain' => 'dev.app.example.com'), $appRoutes);

我不确定此解决方案是否会对性能产生重大影响。

对此也感兴趣!我正在尝试注册一个本地开发+生产子域路由,用于一个控制器操作

i、 e

我试过:

# Failed
Route::group(array('domain' => "{account}.app.{top_level_domain}"), function() {
    Route::get('/{id}', 'SomeController@getShow');
});
但它失败了

这不是一个大问题,正如DesignerGuy所提到的,我可以将一个函数传递给两个路由,但是如果它们可以分组的话,这将更加优雅:)

请查看此链接

Route::group(数组('domain'=>'{subdomain}.example.com'),函数()
{
...
});
或者使用这个软件包

它可以帮助您像这样设置组路由上的位置

Route::group(数组('domain'=>'{maindomain}'),函数()
{
...
})->其中('maindomain','.+\.example\.com$');
签入,如果您的主域是myapp,生产中是
myapp.com
,本地环境中是
myapp.dev
请尝试使用
*

Route::group(array('domain' => '{subdomain}.myapp.*'), 
function()
{
    ...
});
拉威尔5.1


Route::pattern('subdomain', '(dev.app|app)');
Route::group(['domain' => '{subdomain}.example.com'], function () {
  ...
});
据 在laravel 5.4+中,您可以使用以下方式:

Route::domain('{account}.myapp.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

您也可以传递域名:

Route::pattern('domain', '(domain1.develop|domain2.develop|domain.com)');
Route::group(['domain' => '{domain}'], function() {
    Route::get('/', function($domain) {
        return 'This is the page for ' . $domain . '!';
    });
});
以防您需要知道控制器是用哪个域名调用的。
使用Laravel 5.6对其进行了测试。

在Laravel关于同一主题的讨论中发现的一个更好的答案是使用宏。这对我很有用。

Route::宏(“域”,函数(数组$domains,\Closure$definition){
foreach($domains作为$domain){
路由::组(['domain'=>$domain],$definition);
}
});
路由::域(['foo.bar.dev','foo.bar'],函数($Route){
//做事
});

我正在尝试解决类似的问题。也就是说,在生产环境中使用“ui.domain.com”和“api.domain.com”,同时允许我的开发团队在本地开发环境中使用“ui.domain.local”和“api.domain.local”。在子域之后支持通配符就可以了。我要解决的基本问题是解决相互冲突的路线。例如,ui.domain.com/messages应返回HTML,api.domain.com/messages应返回JSON。因此,两个具有“域”=>“api:(:any)”和“域”=>“ui::any)”的组是理想的。这是一个很好的技巧。但是请注意,域参数将作为任何子路由的第一个参数传递:
Route::get('users/{id},'UsersController@show'); // id=“example.com”
为了避免这种情况,您可以始终使用环境变量:
$domain=env('BASE_domain','example.com');路由::组(['domain'=>'subdomain..$domain],function(){…})这不起作用
路由::组(数组('domain'=>'{maindomain}'),函数(){…})->其中('maindomain','.+\.example\.com$)谢谢。我认为这不会影响性能,因为您只是将其存储在数组变量中,并将其填充到2声明中。干杯这真的适用于
php artisan route:cache
?“无法缓存基于闭合的路由。若要使用路由缓存,必须将任何闭合路由转换为控制器类。”我不确定@Fredrik,但这句话可能是针对实际的路由实现,而不是路由的构造。在上面的示例中,如果
Route::get
引用了一个控制器方法,那么它可能是可缓存的。
Route::domain('{account}.myapp.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});
Route::pattern('domain', '(domain1.develop|domain2.develop|domain.com)');
Route::group(['domain' => '{domain}'], function() {
    Route::get('/', function($domain) {
        return 'This is the page for ' . $domain . '!';
    });
});