это код моего поставщика услуг:
<?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.
хорошо, так что в основном определите свой конфиг (пример имени 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>
Возможно, вы захотите изменить некоторые из них, но основная идея заключается в том, чтобы решить вашу проблему.
Насколько я понимаю, вы пытаетесь изменить некоторые переменные макета в зависимости от метода контроллера.
Вы должны понимать, что поставщик услуг был создан для других целей. Для управления переменными макета лучше использовать контроллер, вызвав $ this-> layout
Меньше написанного кода не всегда означает лучшее качество. Иногда лучше написать что-то лишнее на случай, если кто-то еще будет работать над этим проектом в будущем.
Также, пожалуйста, не вызывайте контроллеры с других контроллеров. Создает код шагетти. Вместо этого используйте помощников.
Так как вы устанавливаете переменную класса, основанную на контроллере и вызываемой функции.
IndexController @ getIndex — установить класс макета на домашнюю страницу
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
}