如何防止我的Laravel应用程序重复?

时间:2013-11-26 21:38:19

标签: php laravel laravel-4 dry

我目前正在开发一个新的大型应用程序,我正在努力确保从一开始就实施最佳实践。我是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数组,但不知道如何通过这个传递我想要的列。任何想法或建议将不胜感激。

3 个答案:

答案 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);

屏幕截图: enter image description here

答案 2 :(得分:0)

感谢所有回复。我实际上最终使用了Rob Gordijn创建的包。对我来说效果很好,可以防止大量重复。你可以在下面的URl获得这个包:

https://github.com/RobGordijn/Bamboo