我目前正在开发一个新的大型应用程序,我正在努力确保从一开始就实施最佳实践。我是Laravel的新手,所以我有一个问题是如何限制整个应用程序的重复。
作为一个例子,我目前有一个管理部分的资源控制器,它可以产生如下视图:
public function index()
{
// $data will be passed to the view
$data = array(
'pageTitle' => 'Manage Products',
'btn' => array(
'title' => 'Add product',
'url' => 'admin.catalog.product.create',
)
);
return View::make('catalog::product.index', $data)->with('products', Product::all());
}
我的观看文件看起来如此:
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>SKU</th>
<th>Price</th>
<th>Qty</th>
<th>Created</th>
<th><i class="icon-cog"></i></th>
</tr>
</thead>
<tbody>
@foreach ($products as $product)
<tr>
<td>{{ $product->pid }}</td>
<td><a href="{{ URL::route('admin.catalog.product.edit', $product->pid) }}">{{ $product->name }}</a></td>
<td>{{ $product->sku }}</td>
<td>{{ Currency::display($product->price) }}</td>
<td>{{ $product->quantity }}</td>
<td>{{ Dates::showTimeAgo($product->created_at) }}</td>
<td>
<a href="{{ URL::route('admin.catalog.product.edit', $product->pid) }}" class="btn btn-success btn-mini pull-left">Edit</a>
{{ Form::open(array('route' => array('admin.catalog.product.destroy', $product->pid), 'method' => 'delete', 'data-confirm' => 'Are you sure?')) }}
<button type="submit" href="{{ URL::route('admin.catalog.product.destroy', $product->pid) }}" class="btn btn-danger btn-mini">Delete</button>
{{ Form::close() }}
</td>
</tr>
@endforeach
</tbody>
有没有办法可以只使用一个视图文件用于所有管理表,并通过控制器传递我想要的标题和正文列,而不是在上面的视图中对其进行硬编码?
我知道我可以传递$ data数组,但不知道如何通过这个传递我想要的列。任何想法或建议将不胜感激。
答案 0 :(得分:3)
我认为这不是一个关于Laravel的问题,但是嘿,我们走了。
您可以向模型添加函数,以将列名映射到您的值。
public function getColumns()
{
return array(
'ID' => 'pid',
'Name' => 'name',
....
);
}
public function getColumnData()
{
$columns = $this->getColumns();
$records = [];
foreach ($columns as $column) {
if ('name' == $column) {
$data = '<a href="' . URL::route('admin.catalog.product.edit', $this->pid) . '">' . $product->name . '</a>';
} if else (..) {
...
} else {
$data = $this->{$column};
}
}
return $records;
}
你的观点会变成这样:
<thead>
<tr>
@foreach ($records->first()->getColumns() as $column)
<th>{{ $column->name }}</th>
@endforeach
</tr>
</thead>
<tbody>
@foreach ($records->all() as $record)
<tr>
@foreach ($record->getColumnData() as $data)
<td>{{ $data }}</td>
@endforeach
</tr>
@endforeach
</tbody>
答案 1 :(得分:1)
我想要这个
查看:强>
<table>
<thead>
<tr>
@foreach ($records[0] as $k => $v)
<th>{{ ucwords(str_replace('_', ' ', $k)) }}</th>
@endforeach
</tr>
</thead>
<tbody>
@foreach ($records as $record)
<tr>
@foreach ($record as $col)
<td>{{ $col }}</td>
@endforeach
</tr>
@endforeach
</tbody>
</table>
控制器:(使用getColumns
辅助功能)
$users = User::all();
// In the first array, just pass the fields
// you want to get, second one is data array
$data['records'] = getColumns(array('id', 'username', 'email'), $users->toArray());
return View::make('user.users', $data);
或者,您可以像这样使用它
$users = User::all()->toArray();
// In this example, I want to show only
// username, first_name and last_name
$records = getColumns(array('username', 'first_name', 'last_name'), $users);
return View::make('user.users')->with('records', $records);
这是一个辅助函数,可以在任何模型/控制器中使用它
function getColumns($keys, $result)
{
$records = array();
foreach ($result as $row) {
$record = array();
foreach ($row as $k => $v) {
if(in_array($k, $keys)) $record[$k] = $v;
}
$records[] = $record;
}
return $records;
}
我正在使用辅助函数,因为我可以将它与任何模型一起使用,并且它位于我的filters.php
文件中,您可以将它放在任何地方。实际上,我在custom_helpers.php
文件夹中有一个文件app
文件filters.php
,在filters.php
文件的末尾,我就是这个
include "custom_helpers.php";
在这个custom_helpers.php
我有这个辅助功能与其他功能。以下是截图
$users = User::take(5)->get()->toArray();
$records = getColumns(array('username', 'first_name', 'last_name'), $users);
return View::make('user.users')->with('records', $records);
屏幕截图:
答案 2 :(得分:0)
感谢所有回复。我实际上最终使用了Rob Gordijn创建的包。对我来说效果很好,可以防止大量重复。你可以在下面的URl获得这个包: