Я создаю приложение, которое имеет несколько доменных имен, связанных с ним, и различные интерфейсные представления / веб-сайты, основанные на этих доменных именах и связанные с ними.
Теперь я хотел бы установить некоторые переменные на основе доменного имени и сделать их пригодными для использования в моих контроллерах и логике приложения.
например, все представления для разных внешних интерфейсов хранятся в разных папках в зависимости от имени домена (ziv, dbg, dbe). Допустим, если пользователь достигает приложения через example.com, необходимо установить переменную, чтобы загружаемые представления были из папки «exm». Это будет выглядеть так:
View::make('frontend.' . $folderVariable . '.home')->with('info', $info);
Мой вопрос: где я должен разместить такой код?
Должно ли это быть в файле начальной загрузки или в базовом контроллере, который наследуют все другие контроллеры? Мне нужна информация о доменном имени во всем приложении, поэтому его нужно загружать заранее.
Заранее спасибо!
Попробуйте использовать класс 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()
это просто вызвало бы класс обслуживания с заданным значением.
Вы можете создать промежуточное программное обеспечение следующим образом:
<?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);