如何有效地将子域名传递给 Laravel 中的控制器和视图

Posted

技术标签:

【中文标题】如何有效地将子域名传递给 Laravel 中的控制器和视图【英文标题】:How to pass subdomain name into controllers and views in Laravel efficiently 【发布时间】:2017-09-10 16:28:21 【问题描述】:

我正在 Laravel 5.5 中构建一个新应用程序,它将严重依赖其子域名。

我已经成功地为子域路由设置了一个路由组,但最终我需要子域名变量可用于每个控制器和每个视图。

我已经有一个自定义 View Composer,我在其中将会话变量传递给每个视图。如何使子域名可用于 View Composer?我不认为我可以通过 Request 对象访问子域。

另外,是否可以将子域名传递给每个控制器及其方法,而无需在每个方法中指定参数?

目前,我的路由如下:

Route::domain('sub.something.com')->group(function () 
Route::prefix('admin')->group(function ($sub) 
    Route::get('/', 'AdminController@methodroute1')->name('admin.route1');
    Route::get('/route2', 'AdminController@methodroute2')->name('admin.route2');
    Route::post('/', 'AdminController@methodroute3')->name('admin.route3');
/snip

但是这样,我需要将每个控制器方法定义为

public function method($sub)

更糟糕的是,调用每个命名路由并将 $sub 参数传递给每个视图,如下所示:

public function method($sub)
    if(Sentinel::check())
        return redirect()->route('admin.route1',$sub);
     else 
        return view('admin.route2')->with('sub',$sub);
    

在视图中:

 route('admin.route1',$sub) 

我知道我是否真的需要将 $sub 变量传递给视图和控制器,但我更喜欢使用 View Composer 来自动化它:

public function __construct()

    $this->user = session('user');
    $this->userdata = session('userdata');
    $this->permissions = session('permissions');



public function compose(View $view)

    $view->with(['user' => $this->user, 'userdata' => $this->userdata, 'permissions' => $this->permissions]);

那么如何将 $sub 放入我的 View Composer 以便能够将其定义为:

$this->subdomain = $sub_from_somewhere

还是我做错了?我找不到任何更有效的方法来构建包含子域逻辑的应用程序。

非常感谢。

【问题讨论】:

【参考方案1】:

您可以使用帮助函数 request() 来访问所有当前请求参数。在您的情况下,您可以像这样访问刀片中的“子”值:

request("sub")

【讨论】:

【参考方案2】:

这是一个简单的解决方案:

Route::current()->parameter('sub')

您可以在控制器中使用它或传递给视图。

【讨论】:

以上是关于如何有效地将子域名传递给 Laravel 中的控制器和视图的主要内容,如果未能解决你的问题,请参考以下文章

如何动态地将表名传递给 PL SQL 游标?

如何使用laravel中的控制器将多个变量传递给视图

如何获取单选按钮的值并将其传递给 laravel 中的控制器?

如何将视图中的数组传递给 ajax 并在 Laravel 5 的控制器中访问?

如何通过控制器将两个不同模型的值作为 Laravel 8 中的单个返回变量传递给视图文件

Laravel 5 中间件路由群组子域名路由