Laravel Access 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 Event Dispatch. Мне удалось получить имя контроллера и имя acion из Laravel Face Route.но как получить доступ к разметке ???
Я уже знаю, что все поставщики услуг расширяют класс «Поставщик услуг» и «Поставщик услуг» имеют свойство, называемое «приложение», и таким образом у нас есть доступ к IOC laravel.

Решено.

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

1

Решение

хорошо, так что в основном определите свой конфиг (пример имени class.php) как-то вроде

return [
'IndexController@getIndex' => 'homepage',
'IndexController@getHowworks' => '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>

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

1

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

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

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

0

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

  1. IndexController @ getIndex — установить класс макета на домашнюю страницу

  2. IndexController @ getHowworks — установить класс макета в режим «как это работает»

Если вы используете значения по умолчанию и расширяете 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);
}
}
}

Тогда в вашем контроллере вы сможете сделать это:

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
По вопросам рекламы [email protected]