Php 在blade和laravel中简化此@foreach/if
我对laravel(特别是L5)相当陌生,我正在制作自己版本的todo应用程序,而不是遵循其中的一个教程。到目前为止,我已经学到了很多东西,但是我在我的刀片式模板中展示这段代码的方式让我认为他们可能是一种更简单的方法 我的Php 在blade和laravel中简化此@foreach/if,php,laravel,laravel-5,Php,Laravel,Laravel 5,我对laravel(特别是L5)相当陌生,我正在制作自己版本的todo应用程序,而不是遵循其中的一个教程。到目前为止,我已经学到了很多东西,但是我在我的刀片式模板中展示这段代码的方式让我认为他们可能是一种更简单的方法 我的TodosController@indexfn是 public function index() { $todos = Todo::get(); return view('todos', compact('todos')); } App\Todo扩展了雄辩的模
TodosController@index
fn是
public function index()
{
$todos = Todo::get();
return view('todos', compact('todos'));
}
App\Todo
扩展了雄辩的
模型,使数据处理变得非常简单
我的路线是:
Route::bind('todos', function($slug)
{
return App\Todo::whereSlug($slug)->first();
});
因此,我的页面只是显示一个无序的“待办事项”列表。我想要两份单独的清单。一个用于完成待办事项,另一个用于未完成待办事项。到目前为止,我的刀片模板看起来像这样,看起来有点凌乱。另外,我将结果循环两次,这是我认为我可以改进的地方
<h3>Incomplete</h3>
<ul>
@foreach ($todos as $todo)
@if ($todo->completed == 'No')
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endif
@endforeach
</ul>
<h3>Complete</h3>
<ul>
@foreach ($todos as $todo)
@if ($todo->completed == 'Yes')
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endif
@endforeach
</ul>
不完整
@foreach($todo作为$todo)
@如果($todo->completed=='No')
-
@恩迪夫
@endforeach
完成
@foreach($todo作为$todo)
@如果($todo->completed=='Yes')
-
@恩迪夫
@endforeach
有没有简化刀片模板的建议?只是稍微简化了一点,但是 您可以在控制器中尝试:
public function index()
{
$completed = Todo::where('completed','Yes')->get();
$incompleted = Todo::where('completed','No')->get();
return view('todos', compact('completed', 'incompleted'));
}
public function index()
{
$todos = Todo::where('user_id', '=', Auth::id())->get();
$complete = $todos->filter(function ($item) {
return $item->completed = 'Yes';
});
$incomplete = $todos->filter(function ($item) {
return $item->completed = 'No';
});
return view('todos', compact('complete', 'incomplete'));
}
在模板中:
<h3>Incomplete</h3>
<ul>
@foreach ($incompleted as $todo)
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endforeach
</ul>
<h3>Complete</h3>
<ul>
@foreach ($completed as $todo)
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endforeach
</ul>
不完整
@foreach(未完成为$todo)
-
@endforeach
完成
@foreach($todo完成)
-
@endforeach
使用子模板的另一种方法如下:
//_list_todos.blade.php
@foreach ($todos as $todo)
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endforeach
<h3>Incomplete</h3>
<ul>
@include('_list_todos',['todos'=>$incompleted] )
</ul>
<h3>Complete</h3>
<ul>
@include('_list_todos',['todos'=>$completed] )
</ul>
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
/\u list\u todos.blade.php
@foreach($todo作为$todo)
@endforeach
您的主模板如下所示:
//_list_todos.blade.php
@foreach ($todos as $todo)
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endforeach
<h3>Incomplete</h3>
<ul>
@include('_list_todos',['todos'=>$incompleted] )
</ul>
<h3>Complete</h3>
<ul>
@include('_list_todos',['todos'=>$completed] )
</ul>
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
不完整
@包括(“‘待办事项’,[‘待办事项’=>$incompleted])
完成
@包括(“‘待办事项’,[‘待办事项’=>$completed])
像上一个模板一样使用子模板的好处是,您可以重用代码,并简化主模板。只是稍微简化了一点,但 您可以在控制器中尝试:
public function index()
{
$completed = Todo::where('completed','Yes')->get();
$incompleted = Todo::where('completed','No')->get();
return view('todos', compact('completed', 'incompleted'));
}
public function index()
{
$todos = Todo::where('user_id', '=', Auth::id())->get();
$complete = $todos->filter(function ($item) {
return $item->completed = 'Yes';
});
$incomplete = $todos->filter(function ($item) {
return $item->completed = 'No';
});
return view('todos', compact('complete', 'incomplete'));
}
在模板中:
<h3>Incomplete</h3>
<ul>
@foreach ($incompleted as $todo)
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endforeach
</ul>
<h3>Complete</h3>
<ul>
@foreach ($completed as $todo)
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endforeach
</ul>
不完整
@foreach(未完成为$todo)
-
@endforeach
完成
@foreach($todo完成)
-
@endforeach
使用子模板的另一种方法如下:
//_list_todos.blade.php
@foreach ($todos as $todo)
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endforeach
<h3>Incomplete</h3>
<ul>
@include('_list_todos',['todos'=>$incompleted] )
</ul>
<h3>Complete</h3>
<ul>
@include('_list_todos',['todos'=>$completed] )
</ul>
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
/\u list\u todos.blade.php
@foreach($todo作为$todo)
@endforeach
您的主模板如下所示:
//_list_todos.blade.php
@foreach ($todos as $todo)
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
@endforeach
<h3>Incomplete</h3>
<ul>
@include('_list_todos',['todos'=>$incompleted] )
</ul>
<h3>Complete</h3>
<ul>
@include('_list_todos',['todos'=>$completed] )
</ul>
<li>
<a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>
不完整
@包括(“‘待办事项’,[‘待办事项’=>$incompleted])
完成
@包括(“‘待办事项’,[‘待办事项’=>$completed])
像上一个模板一样使用子模板的好处是,您可以重用代码,并简化主模板。使代码干涸。您可以通过将实际项目标记向上移动到部分模板来简化它,因为它在完整和不完整列表中都会重复:
<h3>Incomplete</h3>
<ul>
@foreach ($todos as $todo)
@if ($todo->completed == 'No')
@include('partials.items.todo')
@endif
@endforeach
</ul>
<h3>Complete</h3>
<ul>
@foreach ($todos as $todo)
@if ($todo->completed == 'Yes')
@include('partials.items.todo')
@endif
@endforeach
</ul>
我也会重新考虑你的循环。您可以在控制器中拆分它们,而不是在同一列表上循环两次:
public function index()
{
$completed = Todo::where('completed','Yes')->get();
$incompleted = Todo::where('completed','No')->get();
return view('todos', compact('completed', 'incompleted'));
}
public function index()
{
$todos = Todo::where('user_id', '=', Auth::id())->get();
$complete = $todos->filter(function ($item) {
return $item->completed = 'Yes';
});
$incomplete = $todos->filter(function ($item) {
return $item->completed = 'No';
});
return view('todos', compact('complete', 'incomplete'));
}
查看您的Todo
模型,我还将数据库中的completed
列设置为布尔字段,而不是包含“Yes”或“No”字符串的列。然后可以将该列值强制转换为适当的布尔值(因为MySQL没有本机布尔字段类型):
然后重新考虑控制器操作以使用此选项:
public function index()
{
$todos = Todo::where('user_id', '=', Auth::id())->get();
$complete = $todos->filter(function ($item) {
return $item->isComplete() === true;
});
$incomplete = $todos->filter(function ($item) {
return $item->isComplete() === false;
});
return view('todos', compact('complete', 'incomplete'));
}
您甚至可以将这些集合筛选器移动到自定义的TodoCollection
类:
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
class TodoCollection extends EloquentCollection
{
public function complete()
{
return $this->filter(function ($item) {
return $item->isComplete() === true;
});
}
public function incomplete()
{
return $this->filter(function ($item) {
return $item->isComplete() === false;
});
}
}
很抱歉回答得太长,但我应该给你一些启发,告诉你如何重新考虑你的代码。擦干你的代码。您可以通过将实际项目标记向上移动到部分模板来简化它,因为它在完整和不完整列表中都会重复:
<h3>Incomplete</h3>
<ul>
@foreach ($todos as $todo)
@if ($todo->completed == 'No')
@include('partials.items.todo')
@endif
@endforeach
</ul>
<h3>Complete</h3>
<ul>
@foreach ($todos as $todo)
@if ($todo->completed == 'Yes')
@include('partials.items.todo')
@endif
@endforeach
</ul>
我也会重新考虑你的循环。您可以在控制器中拆分它们,而不是在同一列表上循环两次:
public function index()
{
$completed = Todo::where('completed','Yes')->get();
$incompleted = Todo::where('completed','No')->get();
return view('todos', compact('completed', 'incompleted'));
}
public function index()
{
$todos = Todo::where('user_id', '=', Auth::id())->get();
$complete = $todos->filter(function ($item) {
return $item->completed = 'Yes';
});
$incomplete = $todos->filter(function ($item) {
return $item->completed = 'No';
});
return view('todos', compact('complete', 'incomplete'));
}
查看您的Todo
模型,我还将数据库中的completed
列设置为布尔字段,而不是包含“Yes”或“No”字符串的列。然后可以将该列值强制转换为适当的布尔值(因为MySQL没有本机布尔字段类型):
然后重新考虑控制器操作以使用此选项:
public function index()
{
$todos = Todo::where('user_id', '=', Auth::id())->get();
$complete = $todos->filter(function ($item) {
return $item->isComplete() === true;
});
$incomplete = $todos->filter(function ($item) {
return $item->isComplete() === false;
});
return view('todos', compact('complete', 'incomplete'));
}
您甚至可以将这些集合筛选器移动到自定义的TodoCollection
类:
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
class TodoCollection extends EloquentCollection
{
public function complete()
{
return $this->filter(function ($item) {
return $item->isComplete() === true;
});
}
public function incomplete()
{
return $this->filter(function ($item) {
return $item->isComplete() === false;
});
}
}
很抱歉,回复太长,但应该让您了解如何重新考虑代码。因为您有两个不同的标题,乍一看,我不相信有多少方法可以避免重复两次。您可以尝试在控制器中筛选结果集并分配两个变量-一个是已完成的变量,另一个是未完成的变量。您也可以尝试编写一个简单的宏,但我认为它不够有效。如果我有什么想法,我会编辑我的评论。因为你有两个不同的标题,乍一看,我不相信有多少方法可以避免重复两次。您可以尝试在控制器中筛选结果集并分配两个变量-一个是已完成的变量,另一个是未完成的变量。您也可以尝试编写一个简单的宏,但我认为它不够有效。如果我有什么想法,我会编辑我的评论。很好的回答。这正是您应该如何处理这种情况的,因为在视图的if块中会有更多的logic/html。如果你只是简单地列出一个待办事项,这可能有些过分,但在我看来仍然是最好的做法。太棒了,老兄,谢谢你。这正是我想要的。你在索引fn中所做的就是我在寻找的