Laravel 服务提供商中的访问布局

Laravel Access Layout in service provider

这是我的服务提供商代码:

<?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 事件调度获取我的服务提供商中加载的当前控制器或当前布局 我能够从 Laravel Face 获取控制器名称和 acion 名称Route.but 如何访问布局 ??? 我已经知道所有服务提供商都扩展服务提供商和服务提供商 class 有一个 属性 调用的应用程序,这样我们就可以访问 laravel IOC。

已解决。

我的问题都解决了,但是我不知道如何访问已经调度的控制器实例。 而且我已经阅读了容器和控制器以及服务提供商的源代码,这是不可能的。也许我应该自己扩展 laravel 容器。

据我了解,您尝试根据调用的控制器方法更改一些布局变量。 您必须了解服务提供者是为其他目的而创建的。要操作布局变量,最好通过调用 $this->layout 来使用控制器 编写更少的代码并不总是意味着更好的质量。有时最好多写一些东西,以防将来其他人会在这个项目上工作。

另外请不要从其他控制器调用控制器。它创建 shagetti 代码。请改用助手。

由于您根据控制器和调用的函数设置了 class 变量。

  1. IndexController@getIndex - 将布局 class 设置为主页

  2. IndexController@getHowworks - 将布局 class 设置为 how-does-it-work

如果您使用默认设置并扩展 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
}

好的,所以基本上将您的配置(示例名称 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);
}

那么为了简单地使用它,像这样放入你的 blade 控制器:

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

您可能想要更改其中的一些内容,但基本概念已经可以解决您的问题。