为了账号安全,请及时绑定邮箱和手机立即绑定

在 Laravel 中将类名传递给视图的常见做法

在 Laravel 中将类名传递给视图的常见做法

PHP
翻翻过去那场雪 2021-11-26 14:46:13
我有一个控制器方法,可以将模型名称和类名称传递给视图。然后在另一个控制器方法中实例化这些类。在这种情况下,我使用的是 Laravel Excel 包。public function index(){    $exports = [        'Model name 1' => TestExport::class,        'Model name 2' => AnotherExport::class    ];    return view('export', compact('exports'));}public function download(string $collection){    return Excel::download(new $collection(), 'Export.xlsx');}我的视图文件然后重定向到download具有特定类名的控制器方法。@foreach($exports as $name => $collection)  <a href="{{ action('ExportController@download', $collection) }}">Download</a>@endforeach因为我正在学习设计模式,并注意到它会破坏 DRY 规则,所以我不想要另一个控制器方法或我下载的每个不同的 Excel 文件。这是好的做法还是可以做得更好?
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

您可以使$exports这两种方法通用,并且不接受请求中的类名。


const EXPORTS = [

        'export_name_1' => TestExport::class,

        'export_name_2' => AnotherExport::class,

    ];

public function index()

{

    return view('export', compact(self::EXPORTS));

}



public function download(string $collection)

{

    if (!isset(self::EXPORTS[$collection]) {

        return 'error';

    }

    $className = self::EXPORTS[$collection];

    return Excel::download(new $className(), 'Export.xlsx');

}

永远不要让请求操作破坏你的代码。对于export_name,您可以简单地使用整数或数组简单索引。


看法


@foreach($exports as $name => $collection)

  <a href="{{ action('ExportController@download', $name)}}">Download</a>

@endforeach


查看完整回答
反对 回复 2021-11-26
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

对我来说,感觉就像您的解决方案是将视图逻辑与控制器逻辑混合在一起。

  • 控制器应该处理传入的请求,获取正确的数据,然后形成响应。

  • 视图应根据给定数据处理任何逻辑以呈现输出页面。

在您的情况下,您传递给视图的数据不会被检索,它只是一个静态列表,也可以保存在视图中。更好的解决方案是:

  1. 在您的刀片模板中有一个路由列表(而不是类列表),然后对其进行迭代。

  2. 如果路由列表不是那么长,请对整个列表进行硬编码,而不是使其动态化。

这样做的主要原因是为了防止出现很多“魔法”代码。例如,在您的刀片模板中,您希望exports是一个数组,其中包含一个类列表,这些类必须是控制器,并且必须具有download函数,否则代码会中断。

解决方案 1 的示例如下所示:

<?php

 // You could consider moving $routes to the controller

$routes = [

    action('ExportController@download', TestExport::class),

    action('ExportController@download', AnotherExport::class),

];


@foreach($routes as $route)

    <a href="{{ $route }}">Download</a>

@endforeach


查看完整回答
反对 回复 2021-11-26
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信