2015-01-23 2 views
3

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

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

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

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

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

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

Заранее благодарен!

+0

я имел место его в базовый контроллер в моем проекте .. но не уверен, что это лучший способ сделать это. – goldlife

+1

В Laravel 4.2 вы можете сделать это в 'App: before()', расположенном в '/ app/filters.php'. Используйте 'View :: share()', чтобы он был доступен во всех представлениях или 'Config :: set()', чтобы он был доступен везде. – user2094178

ответ

1

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

Либо это, либо расширить класс вида \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'); 
    } 
} 

Вы бы затем вставить этот класс, где вам необходимо иметь определенную функцию домена выполняется. То есть - BaseController, расширение Просмотр функциональности (вы можете сделать View::domainMake() что бы просто назвать класс обслуживания со значением данного

+0

Итак, в методе загрузки ServiceProvider я бы поставил некоторую логику, которая проверяет домен и устанавливает некоторые vars? Как я могу сделать это доступным в моих контроллерах, например? –

+0

Это приятное решение, но это просто для просмотров. Я также хочу иметь возможность загружать разные ключи API из моих конфигурационных файлов на основе имени домена. Поэтому я хотел бы, чтобы переменные домена были доступны во всем приложении, а не только для представлений.Считаете ли вы, что использование этой логики в публичной функции в базовом контроллере и загрузка этого метода в конструкторе базовых контроллеров лучше для функциональности, которую я бы хотел? Или это не лучшее решение? –

+0

Расширение контроллера - это вариант, но что, если вам нужна эта функциональность в другой части вашего приложения? Использование класса сервиса означает, что вы можете поместить этот класс в любое место в вашем приложении и повторно использовать его, одновременно делая его легко проверяемым. Затем вы можете использовать этот класс обслуживания в расширяемом контроллере AND в методе расширения вида. Если вы еще не использовали классы обслуживания, прежде чем обращаться к нему, доступно много учебников. – Everon

0

Вы можете создать промежуточное программное обеспечение, как это:

<?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); 
    } 
} 

и register this middleware to the kernel.php as global, так что это будет. выполняется при каждом запросе HTTP.

Теперь в каждом файле (Controller/View/и т.д.), вы можете проверить на какой домен вы

<?php 

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

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

View::make('frontend.' . domain . '.home')->with('info', $info); 
Смежные вопросы