服务提供商中的Laravel Access Layout

时间:2015-01-27 08:57:00

标签: php laravel layout service laravel-4

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

<?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 Route获取控制器名称和acion名称。但是如何访问布局??? 我已经知道所有服务提供者都扩展了服务提供者,服务提供者类有一个名为app的属性,这样我们就可以访问laravel IOC。

解决了。

毕竟我的问题已经解决,但我还不知道如何访问已分派的控制器实例。 因为我已经读过容器和控制器以及服务提供商的源代码,所以这是不可能的。也许我应该自己扩展laravel容器。

3 个答案:

答案 0 :(得分: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 :(得分:0)

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

另外请不要给其他控制器打电话给控制器。它创建了shagetti代码。改为使用助手。

答案 2 :(得分:0)

因为你根据控制器和被调用的函数设置了一个类变量。

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

  2. IndexController @ getHowworks - 将布局类设置为如何工作

  3. 如果您使用默认值并扩展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
    }