【问题标题】:Passing variable from controller to the master layout将变量从控制器传递到主布局
【发布时间】:2014-05-13 17:39:07
【问题描述】:

我在views/layouts/main.blade.php 中有一个主布局 如何传递我的 ListingsController.php 中的变量

public function getMain() {
        $uname = Auth::user()->firstname;
        $this->layout->content = View::make('listings/main')->with('name', $uname);
 }

然后我将它添加到我的 main.blade.php 中,它位于 Listings/main 中

@if(!Auth::check()) 
<h2>Hello, {{ $name }}</h2>
@endif

它可以工作,但我无法将该变量传递给 views/layouts/main.blade.php 中的 mmaster 布局 我只需要在标题中显示用户的名字。

【问题讨论】:

    标签: php laravel laravel-4 blade


    【解决方案1】:

    它应该按照它的方式工作,但是...如果您需要将某些内容传播到多个视图,您最好使用View::composer()View::share()

    View::share('name', Auth::user()->firstname);
    

    如果您只在 layout.main 上需要它,您可以:

    View::composer('layouts.main', function($view)
    {
        $view->with('name', Auth::check() ? Auth::user()->firstname : '');
    });
    

    如果您的所有视图都需要它,您可以:

    View::composer('*', function($view)
    {
        $view->with('name', Auth::check() ? Auth::user()->firstname : '');
    });
    

    您甚至可以为此创建一个文件,例如 app/composers.php 并将其加载到您的 app/start/global.php

    require app_path().'/composers.php';
    

    【讨论】:

    • 我将第二个 sn-p 添加到我的 ListingsController 的构造中,它在所有“列表”页面上都可用,但是当我转到用户/仪表板时,我收到一个错误“未找到变量”。我尝试了第二种方法来创建一个文件并将其加载到 global.php 中,但这也不起作用,同样的错误。
    • 我也将它添加到 UsersController.php 中,现在所有用户都可以使用它/*,但我认为这不实用。
    • 它不是,它应该在全球范围内使用作曲家。这就是我为我的观点所做的,它真的很好用。尝试从控制器中删除并使用 View::composer('*', ...) 它必须将其绑定到您的所有视图。
    • 这是我现在在列表中的视图 __construct View::composer('*', function($view) { $view->with('name', Auth::user()->firstname ); });但我仍然遇到同样的错误。
    • 我认为它有效。我重新访问了我刚刚创建的 composers.php,我在那里有一个错字。非常感谢。
    【解决方案2】:

    为此使用一个专门的类。

    第一:

    // app/Providers/AppServiceProvider.php
    public function boot()
    {
        view()->composer('layouts.master', 'App\Http\Composers\MasterComposer');
    }
    

    然后:

    // app/Http/Composers/MasterComposer.php
    use Illuminate\Contracts\View\View;
    
    class MasterComposer {
    
        public function compose(View $view)
        {
            $view->with('variable', 'myvariable');
        }
    }
    

    记得注册服务商。

    更多:https://laracasts.com/series/laravel-5-fundamentals/episodes/25

    【讨论】:

      【解决方案3】:
      $this->data['uname'] = 'some_username';
      return View::make('dashboard.home', $this->data);
      

      编辑:: 示例:

      <?php 
      class BaseController extends Controller {
      
          /**
           * Setup the layout used by the controller.
           *
           * @return void
           */
              protected $layout = 'layouts.front';
      
          protected function setupLayout()
          {
              if ( ! is_null($this->layout))
              {
                     $this->data['sidewide_var'] = 'This will be shown on every page';
                 $this->layout = View::make($this->layout, $this->data);
              }
          }
      
      }
      

      _

      <?php 
      class BlogController extends BaseController {
          public function getPost($id)
          {
            $this->data['title'] = 'Post title'; //this will exist on only this page, but can be used in layouts/front.blade.php (for example)
            return View::make('blog.single_post', $this->data);
          }
      }
      

      这就是我使用控制器的方式。 $sidewide_var 和 $title 都可以在布局或视图中使用

      【讨论】:

      • 也许您可以添加更多信息?现在你的帖子很混乱。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2012-02-10
      • 2016-01-11
      • 2017-05-28
      • 1970-01-01
      • 2015-09-10
      相关资源
      最近更新 更多