【问题标题】:Laravel Access Layout in service provider服务提供者中的 Laravel 访问布局
【发布时间】:2015-03-25 19:59:38
【问题描述】:

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

<?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 获取加载到我的服务提供者中的当前控制器或当前布局我能够从 Laravel Face Route 获取控制器名称和动作名称。但是如何访问布局? 我已经知道所有服务提供者都扩展了服务提供者,并且服务提供者类有一个名为 app 的属性,这样我们就可以访问 laravel IOC。

解决了。

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

【问题讨论】:

  • 您能否提供一些背景信息,说明您为什么要这样做,因为可能有更简单的选择?我以前在 symfony2 中做过这个,但看起来你没有很多生命周期中的事件可以在 Laravel 中使用来获取控制器 laravel.com/docs/4.2/lifecycle#application-events
  • 我的项目中有这么多页面,我的布局有一个带有容器 id 的 div,并且在每个页面中它都有特定的类,例如在联系页面中是这样的:“
    " 我认为在所有控制器上的每个操作中传递这些类名并不是一件好事我想要一个开关盒来在路由和控制器上设置容器类被调度的动作。
  • 基本上,如果我是你,我会在你的视图中创建一个辅助函数来查找配置文件中的控制器/动作,获取值并应用 CSS 类。它仍然看起来很狡猾,但你原来的想法是一个糟糕的方式去
  • 可以解释更多并将您的想法写成答案,因为我认为这是一个好主意,但我有点困惑该怎么做,如果我明白你的意思并且我解决了我的问题,请标记你的答案作为接受的答案。谢谢

标签: php laravel layout service laravel-4


【解决方案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>

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

【讨论】:

  • 谢谢它就像一个魅力你是一个生命的救世主;)
【解决方案2】:

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

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

【讨论】:

  • 首先感谢您的回答。我不想在另一个控制器中调用控制器,我只想获取已调度的控制器实例。我同意你的观点,编写的代码越少并不总是意味着质量越好,但你应该考虑我的情况。在我的项目中,我有很多页面,每个页面都有一个容器元素,每个容器类属性都不同于其他类,这些类是静态的,并且在每个操作中传递这些类名不是很可读和干净我需要一个开关盒根据操作为每个视图设置类的语句。
【解决方案3】:

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

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

  2. IndexController@getHowworks - 将布局类设置为 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
}

【讨论】:

  • 感谢 Terre,但我只是不想在每个动作中将变量传递给布局,而是编写一个 switch case 语句来在控制器和动作上设置这个变量,这被称为其他地方但不在我的控制器。
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2016-12-21
  • 2015-10-24
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多