2015-01-19 1 views
3

У меня есть два файла с лезвиями для каждого маршрута, один для Интернета и один для мобильных устройств. Я не знаю, как правильно обрабатывать запросы. Это правильный способ:Как визуализировать веб-и мобильные представления в Laravel

В конце каждой функции контроллера (для каждого запроса)

If it is mobile (via Jenssegers) 
    View::make(file_mobile.blade.php) 
else 
    View::make(file_web.blade.php) 

Что вы могли бы предложить?

ответ

9

Одним из вариантов было бы использование библиотеки, такой как агент Laravel.

https://github.com/jenssegers/Laravel-Agent

if (Agent::isMobile()) { 
    View::make("file_mobile.blade.php"); 
} else { 
    View::make("file_web.blade.php"); 
} 

Вместо того, чтобы повторять это в каждом методе контроллера, вы можете захотеть абстрагировать это. response macro кажется как хороший вариант, может быть что-то вроде:

Response::macro('ress', function($viewname) 
{ 
    if (Agent::isMobile()) { 
     return View::make($viewname . "_mobile.blade.php"); 
    } else { 
     return View::make($viewname . "_web.blade.php"); 
    } 
}); 

Так что вы можете назвать это в контроллере:

return Response::ress('file'); 

Это все непроверенный код, просто указать вам в направлении одно возможное решение.

+0

спасибо. Выполняет ли абстракция предотвращение выполнения функции isMobile для каждого запроса? – horse

+0

Нет, 'isMobile()' все равно будет вызываться по каждому запросу, так как он является частью макроса для каждого вызова действия контроллера. Основная цель этой абстракции - просто очистить ваш код контроллера и освободить от повторяющегося кода. – jszobody

+0

Когда я вхожу «композитор требует, чтобы jenssegers/agent» или «» требовали jenssegers/agent: dev-master, он дает ошибку. «Композитор-композитор обновления» и «самообновление композитора» не решают проблемы. – horse

0

Ответ jszobody, вероятно, лучший, поскольку у вас уже есть представления для каждой сделанной версии, но в будущем я бы рассмотрел макеты контроллеров.

В основном, что вам нужно сделать, это построить два макета, один для мобильных и один для немобильных и установить их в конструкторе BaseController. Эти макеты будут содержать все необходимые стили, navbar или что-то еще, что все ваши взгляды должны иметь вместе.

public function __construct() 
{ 
    $this->layout = Agent::isMobile() ? 'layouts.mobile' : 'layouts.nonMobile'; 
} 

Обе макеты будут иметь @yields('content') дать ему раздел контента, и все ваши взгляды должны быть только беспокоюсь о содержании, которое показывает в макетах.

Тогда все, что вам нужно сделать, это не возвращать представление в ваших контроллерах, просто установите раздел содержимого в макете.

$this->layout->content = View::make('user.content');` 

Это то, что я делаю в своих личных проектах, и это обычно хорошо работает. Если вы хотите поэкспериментировать с новым макетом сайта или вам нужно добавить макет мобильного устройства или даже макет администратора, просто создайте макет, измените значение BaseController::__constructor(), чтобы установить его, когда вам нужно, и все готово.

+0

Isn ' t код, который вы вставляли, удалялся при обновлении рамки laravel? – horse

+0

Это не должно. 'BaseController' расширяет' Controller', который является псевдонимом для 'Illuminate \ Routing \ Controller', который будет там, где происходят какие-либо обновления. – user3158900