2015-01-27 3 views
1

это мой код поставщика услуг:Laravel Layout доступа в поставщике услуг

<?php namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 
use Illuminate\Support\Facades\Route; 
use Illuminate\Support\Facades\Event; 

class LayoutVarsServiceProvider extends ServiceProvider { 

    public function register() 
    { 

    } 


    public function boot() 
    { 
     $route = Route::currentRouteAction(); 
     $parts = explode("@" , $route); 

     Event::listen('Illuminate\Events\Dispatcher', function($event) 
     { 
      if($parts[0] = 'IndexController'){ 
       switch($parts[1]) { 
        case 'getIndex': 
         $this->app->layout->container_class = 'homepage'; 
         break; 

        case 'getHowworks': 
         $this->app->layout->container_class = 'how-does-it-work'; 
       } 
      } 
     }); 

    } 
} 

Я хочу, чтобы иметь возможность получить текущий контроллер или текущую схему, которая загружается в моем поставщике услуг с помощью Laravel событий Отправки я был в состоянии получить имя контроллера и имя acion от Laravel Face Route. но как получить доступ к макету ??? Я уже знаю, что все поставщики услуг расширяются. Поставщик услуг и класс поставщика услуг имеют свойство, называемое приложением, и таким образом у нас есть доступ к laravel IOC.

Решено.

после того, как все проблемы решены, но все же я не знаю, как получить доступ к экземпляру контроллера, который был отправлен. , и поскольку я прочитал исходный код контейнера и контроллера и поставщика услуг, это невозможно. возможно, я должен сам распространить контейнер laravel.

+0

Можете ли вы рассказать о том, почему вы хотите сделать это, поскольку может быть более простой вариант?Я сделал это раньше в symfony2, но не похоже, что у вас много событий из жизненного цикла, чтобы работать в Laravel, чтобы захватить контроллер http://laravel.com/docs/4.2/lifecycle#application-events –

+0

У меня так много страниц в моем проекте, и у моего макета есть div с идентификатором контейнера, и на каждой странице он имеет определенный класс, например, на странице контакта: «

», и я думаю, что это не очень хорошая работа, чтобы передать эти имена классов в каждом действии на всех контроллерах. Я хочу иметь случай переключения, чтобы установить класс контейнера по маршруту и ​​контроллеру и действие, которое отправлено. – mhndev

+0

В принципе, если бы я был вами, я бы просто сделал вспомогательную функцию, чтобы использовать в вашем представлении, чтобы найти контроллер/действие в файле конфигурации, получить значение и применить класс CSS. Это все еще кажется изворотливым, но ваша оригинальная идея - плохой путь. –

ответ

1

ИТАК в основном определяют свой конфиг (например, имя class.php) как нечто вроде

return [ 
    '[email protected]' => 'homepage', 
    '[email protected]' => 'how-does-it-work' 
]; 

Затем вы можете создать вспомогательную функцию в отдельном файле, но, как мы используя конфигурацию Laravel, мы могли бы также создать ее как HTML-макрос (вы можете сделать это внутри своего поставщика услуг.

HTML::macro('classLookUp', function() 
{ 
    $route = Route::current(); 

    return Config::get('class'.$route); 
} 

Итак, чтобы просто использовать это, поместите в ваш контроллер лезвия примерно так:

<div id="container" class="{{ HTML::classLookUp() }}"></div> 

Вы можете изменить некоторые из этого, но основная концепция есть, чтобы решить вашу проблему.

+0

спасибо Это работало как шарм, вы спаситель жизни;) – mhndev

0

Как я понимаю, вы пытаетесь изменить некоторые переменные компоновки на основе вызванного метода контроллера. Вы должны понимать, что поставщик услуг был создан для других целей. Чтобы манипулировать переменными компоновки, лучше использовать контроллер, вызывая $ this-> layout Меньше кода, написанного не всегда, означает лучшее качество. Иногда лучше написать что-то дополнительное на случай, если кто-то еще будет работать над этим проектом в будущем.

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

+0

прежде всего за ваш ответ. Я не хочу вызывать контроллер на другом контроллере. Я просто хочу получить экземпляр контроллера, который был отправлен. Я согласен с вами в том, что меньше написанного кода не всегда означает лучшее качество, но вы должны учитывать мою ситуацию. в моем проекте у меня так много страниц, и каждая страница имеет элемент контейнера, и каждый атрибут класса контейнера отличается от других, и эти классы статичны, и передача этих имен классов в каждом действии не очень читаема и чиста. Мне нужно иметь случай переключения чтобы установить класс для каждого представления в зависимости от действия. – mhndev

0

Поскольку вы устанавливаете переменную класса на основе контроллера и вызываемой функции.

  1. IndexController @ GetIndex - набор классов макет на главную

  2. IndexController @ getHowworks - установить класс макета, каким-делает-это-работа

Если вы используете по умолчанию и расширения a BaseController:

class BaseController extends \Controller { 

    /** 
    * Setup the layout used by the controller. 
    * 
    * @return void 
    */ 
     protected function setupLayout() 
     { 
     if (! is_null($this->layout)) 
     { 
      $this->layout = View::make($this->layout); 
     } 
     } 
    } 

Затем в вашем контроллере вы должны иметь возможность t о это сделать:

public function getIndex() 
{ 
    $this->layout->container_class = 'homepage'; 
    ... rest of controller code 
} 


public function getHowworks() 
{ 
    $this->layout->container_class = 'how-does-it-work'; 
    ... rest of controller code 
} 
+0

благодарит Terre, но я просто не хотел передавать переменную в макет в каждом действии, вместо этого пишу оператор case switch, чтобы установить эту переменную на контроллер и действие, которое называется каким-то другим местом, но не в моем контроллере. – mhndev

Смежные вопросы