【问题标题】:Laravel: Include view with controller logicLaravel:包含带有控制器逻辑的视图
【发布时间】:2015-01-18 14:06:46
【问题描述】:

我来自 symfony (v1) 世界,我们有两种类型的局部渲染:partials,加载方式与:

@include('some.view')

和控制器,它们的行为方式完全相同,但会在命中后使用一些控制器逻辑运行。因此,调用与上面相同的方法将首先转到匹配的 some.view 控制器,并按照它所具有的逻辑进行操作。

我正在尝试对 Laravel 做同样的事情。基本上,我有这个:

@foreach($array as $thing)
  @include('controller.like.view', array('thing' => $thing))
@endforeach

... 我希望包含的视图能够运行这样的东西(这只是一个示例,实际代码要复杂得多,否则我只需在 Blade 中使用 if 子句编写它):

...
if ($thing%2) {
      return 'a';
}

return 'b';

... 这样我的循环中只会打印 'a' 或 'b' 。在 Blade 模板中没有一堆 PHP 代码的情况下,实现此目的的最佳方法是什么?

【问题讨论】:

    标签: php laravel controller logic blade


    【解决方案1】:

    为什么不这样呢?

    @foreach($array as $thing)
        @if($thing%2)
            a
        @else
            b
        @endif
    @endforeach
    

    不过,一般来说,在将数据传递给视图之前,这主要是一种在控制器中准备数据的好方法。这样视图只是用于呈现数据。

    你也可以编写一个小辅助函数,甚至是一个完整的类(带有可选的 Facade 以便于访问)但这真的取决于你的需要

    更新

    我不确定这是否是最适合您的解决方案,但这是我能想到的唯一解决方案。
    将尽可能多的逻辑放在“事物”类中,然后在包含的视图中使用它。这是一个例子:

    class Thing {
        public function isA(){
            // do the magic
            return true;
        }
    }
    

    查看

    @if($this->isA())
        a
    @else
        b
    @endif
    

    更新 2

    或者做一个更像你描述的 symfony 的控制器:

    class Thing {
        public function getVars(){
            // do stuff
            return array(
                    'all' => 'the',
                    'vars' => 'you',
                    'need' => 'in',
                    'the' => 'view'
                );
        }
    }
    

    然后当你包含视图时

    @include('item', $thing->getVars())
    

    【讨论】:

    • 这只是一个例子。我需要的实际控制器逻辑要复杂得多,所以只做一个常规的 if 不起作用......这将导致我在一个视图中编写大量 PHP。
    • 当然。我有两个数组,$a 和 $b,对于每个 @include('item', array('item' => $item)),我需要测试该特定项目是否属于 $a 或 $b,并且相应地设置一些标志,这将改变布局的样子。
    • 现在我正在做类似的事情:我有一个静态方法可以获取 $a、$b 和项目并返回我需要的内容......但这似乎有点愚蠢而且太多了一个负担——我并没有真正使用这个类本身,我只是在破解包含背后的一些逻辑。我希望有一个替代方案。
    • 我不得不承认,我真的不知道它是如何与 symfony 一起工作的(而且快速的谷歌搜索无法帮助我)。所以你为什么不快点向我解释一下。控制器是否呈现实际的 html 是否只是为另一个视图“准备”对象?
    • 想象一下你可以做类似@include('item', array('controller' => 'HomeController@parseItem'), array('stuff' => $stuff)) ...您的 parseItem($stuff) 将处理 $stuff,并且您可以返回您需要的任何新的 $vars,这将在“item”中可用。
    猜你喜欢
    • 2016-11-18
    • 2011-08-24
    • 1970-01-01
    • 2013-04-23
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多