Laravel: установить константу / переменную на основе доменного имени

Я создаю приложение, которое имеет несколько доменных имен, связанных с ним, и различные интерфейсные представления / веб-сайты, основанные на этих доменных именах и связанные с ними.

Теперь я хотел бы установить некоторые переменные на основе доменного имени и сделать их пригодными для использования в моих контроллерах и логике приложения.

например, все представления для разных внешних интерфейсов хранятся в разных папках в зависимости от имени домена (ziv, dbg, dbe). Допустим, если пользователь достигает приложения через example.com, необходимо установить переменную, чтобы загружаемые представления были из папки «exm». Это будет выглядеть так:

View::make('frontend.' . $folderVariable . '.home')->with('info', $info);

Мой вопрос: где я должен разместить такой код?

Должно ли это быть в файле начальной загрузки или в базовом контроллере, который наследуют все другие контроллеры? Мне нужна информация о доменном имени во всем приложении, поэтому его нужно загружать заранее.

Заранее спасибо!

3

Решение

Попробуйте использовать класс Service для обработки текущего домена и вернуть подходящую строку для использования с View::make() метод.

Либо это, либо расширить класс View \Illuminate\Support\Facades\View переопределить View::make() или создать другой метод, который автоматически вставляет соответствующую строку. Также возможно использование поставщика услуг.

Пример класса обслуживания — ему не нужен поставщик услуг (зависит от реализации)

class DomainResolver
{
private $subdomains;

public function __construct()
{
//Contains sub domain mappings
$this->subdomains = array(
'accounts' => 'ziv',
'billing' => 'exm'
//Etc etc
);
}

public function getView($view)
{
// Should return the current domain/subdomain
// Replace if I'm wrong (untested)
$subdomain = \Route::getCurrentRoute->domain();

if(isset($this->subdomains[$subdomain]))
{
return View::make($this->subdomains[$subdomain].'.'$view);
}
throw new \Exception('Invalid domain');
}
}

Затем вы вставите этот класс туда, где вам нужно, чтобы выполнялась специфичная для домена функция. I.e — BaseController, просмотр расширений функциональности (вы можете сделать View::domainMake() это просто вызвало бы класс обслуживания с заданным значением.

1

Другие решения

Вы можете создать промежуточное программное обеспечение следующим образом:

<?php

namespace App\Http\Middleware;

use Closure;

class DetectDomainMiddleware
{
/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if($_SERVER['SERVER_NAME'] == 'example.com')
{
define('domain', 'exm');
}
elseif($_SERVER['SERVER_NAME'] == 'example-B.com')
{
define('domain', 'B');
}return $next($request);
}
}

а также зарегистрировать это промежуточное ПО в kernel.php как глобальное, поэтому он будет выполняться для каждого HTTP-запроса.

Теперь в каждом файле (Контроллер / Вид / и т. Д.) Вы можете проверить, в каком домене вы находитесь.

<?php

if(domain == 'exn') {..}
if(domain == 'B') {..}

Ваша команда просмотра может быть изменена на

View::make('frontend.' . domain . '.home')->with('info', $info);
0

По вопросам рекламы [email protected]