【问题标题】:Laravel Views (creator & make)Laravel 视图(创建者和制作者)
【发布时间】:2015-01-01 22:47:34
【问题描述】:

我创建了一个名为 (head.blade.php) 的视图,并尝试使用 View::make() 函数将其加载到 HomeController __construct 函数中。但是,该函数有效,但不适用于变量。

例如这里的函数,带有View::make():

public function __construct() {

  $this->asset = new Asset;

  $assets = array('core');
              $css = $this->asset->generate($assets);

  return View::make('includes.head')->with('styles', $css);  
}

如果我尝试在视图中使用 $styles 变量,它会给我错误:(Undefined variable $styles in...-)

但是,在 Laravel 文档中我发现了这种方法:

public function __construct() {

        $this->asset = new Asset;

        $assets = array('core');

        $css = $this->asset->generate($assets);

        View::creator('includes.head', function($view) use ($css) {
            $view->with('styles', $css);
        });
    }

View::creator 方法有效。

我的问题是,View::make() 如何以及为什么在 __construct 中不起作用?

PS。我正在使用@include 方法在另一个视图中调用视图。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    在一般 OOP 中,您不会从构造函数返回任何值。构造函数的隐式返回值是对象。请记住,每当创建新对象时都会调用构造函数:

    $myObject = new MyObject(); // <-- I just called the MyObject constructor
    

    Laravel 控制器的实例化发生在路由调度之前,因此在构造函数中返回视图在逻辑上是不正确的。另见this answer

    我不确定您为什么要这样做,但我相信这可能是因为您试图将“标题”视图附加到此特定控制器返回的所有视图。如果是这样,这不是您在 Laravel 中执行此操作的方式。为此,请创建一个布局视图,您的其他视图将扩展它:

    <!-- app/views/layout/master.blade.php -->
    <!DOCTYPE html>
    <html>
        <head>
            <title></title>
        </head>
        <body>
    
        <article>
        @include('layout.header')
    
        @yield('content')
    
        @include('layout.footer')
        </article>
        </body>
    </html>
    
    <!-- app/views/layout/header.blade.php -->
    <header>
        A Header
    </header>
    
    <!-- app/views/layout/footer.blade.php -->
    <footer>
        A Footer
    </footer>
    
    <!-- app/views/some-view.blade.php -->
    @extends('layout.master')
    
    @section('content')
    View Content
    @stop
    

    使用此设置,some-view.blade.php 将有一个页眉和一个页脚夹在视图的主要内容之间。

    【讨论】:

    • 感谢您的回复。 :) 是的,这是我想尝试的一件事,而且,我想从配置文件中加载我的资产,我知道有一种使用静态函数的方法。例如在视图中我可以调用:@foreach(Asset::generate(array('core')) as $style) {{ HTML::style($style) }} @endforeach 但是,我不知道安全性如何这是...:/
    • 您试图以什么方式保护它?该代码的最终结果应该只是链接到样式表的引用,所以我不确定您会担心什么。
    • 好吧,我明白了,我需要再考虑一下。谢谢你帮我把事情弄清楚! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多