【问题标题】:Defining multiple variable laravel for use in if statement定义多个变量 laravel 以在 if 语句中使用
【发布时间】:2014-10-20 01:38:36
【问题描述】:

我希望能够根据 url 中调用的变量显示不同的内容。忽略 $slug 是 slug 的事实,假设它是一个帖子 ID,所以如果 $id 处于活动状态,那么只显示帖子如果 $month 处于活动状态,则显示该月的所有帖子 elseif $month 和 $id = null 显示所有。这就是我想要达到的目标

Routes.php

Route::get('blog/{slug}', ['as' => 'blog.slug', 'uses' => 'BlogController@getSlug']);
Route::get('blog/{month}', ['as' => 'blog.slug', 'uses' => 'BlogController@getSlug']); 

博客控制器.php

<?php

类 BlogController 扩展 BaseController {

public function BlogIndex()
   {
     //get the posts from the database by asking the Active Record for "all"
    $blogs = Blog::all();
    $blogs = DB::table('blogs')->paginate(3);
    // and create a view which we return - note dot syntax to go into folder
    return View::make('pages.blog', array('blogs' => $blogs));
}
public function ShowbySlug($slug)
{          
       $blogs = Blog::where('slug', '=', $slug)->get();
// show the view with blog posts (app/views/pages/blog.blade.php)
    return View::make('pages.blog')
        ->with('slug', $slug)
        ->with('blogs', $blogs);
}
public function ShowbyMonth($month)
{
       $blogs = Blog::where('month', '=', $month)->get();
// show the view with blog posts (app/views/pages/blog.blade.php)
    return View::make('pages.blog')
        ->with('month', $month)
         ->with('blogs', $blogs);
}

}

blog.blade.php

   @foreach ($blogs as $blog)
  @if(isset($blogs)) 
    <div class="blog-outer-wrap">
    <img src="images/blog/{{ $blog->img}}"> 
     <div class="blog-header">{{ $blog->header }}</div>
    <div class="blog-text">{{ $blog->content }}</div>
    <a href="{{ URL::route('blog.slug', [$blog->slug]) }}">
    </div>

  @elseif(isset($slug)) 
    <div class="blog-outer-wrap">
    <img src="images/blog/{{ $blog->img}}"> 
     <div class="blog-header">{{ $blog->header }}</div>
    <div class="blog-text">{{ $blog->content }}</div>
    </div>
    @endif
  @endforeach

【问题讨论】:

  • 使用emptyisset 代替is_null
  • 似乎没有根据哪个变量处于活动状态而改变内容,我错过了什么吗?
  • 那是因为blogs 总是被设置
  • 有没有办法取消设置?
  • 你正在使用它,所以没有。只需@if(empty($slug)) .. @else .. @end

标签: php url if-statement laravel laravel-4


【解决方案1】:

你真的不能这样做,因为你只是两次声明了相同的路线。当您说路线是blog/{slug} 时,slug 只是一个占位符。它与blog/{month} 完全相同¹。它只是说:“我希望 blog/ 后面跟着 anything。”不管你打电话给你的anythingslug 还是month。即参数不相加。

您可以做的是,如果您认为slug 始终是一个字符串并且month 始终是一个数字(或月份的名称²),那么您可以将 where 子句应用于您的 route parameters,如下所示:

// Route for all blog posts
Route::get('blog', 'BlogController@showAll');

// Route for all blog posts in a month; only numbers as parameters
Route::get('blog/{month}', 'BlogController@showByMonth')
     ->where('month', '[0-9]+');

// Route for all blog posts by title; anything else as parameters
Route::get('blog/{slang}', 'BlogController@showBySlang');

在你的控制器上,定义三个方法,每个路由一个:

public function showAll() {
    $blogs = Blog::all();

    return View::make('pages.blog')
               ->with('blogs', $blogs);
}

public function showByMonth($month) {
    $blogs = Blog::where('month', $month)
                 ->get();

    return View::make('pages.blog')
               ->with('blogs', $blogs);
}

public function showBySlug($slug) {
    $blogs = Blog::where('slug', $slug)
                 ->get();

    return View::make('pages.blog')
               ->with('blogs', $blogs);
}

¹ 除非您使用一些更高级的路由功能,但这并不是重点。

² 使用 where 子句是可行的,但如果你想考虑所有的大写/小写组合,那就太难看了。例如:([Jj][Aa][Nn][Uu][Aa][Rr][Yy]|[Ff][Ee][Bb][Rr][Uu][Aa][Rr][Yy]|...)

【讨论】:

  • 说得对,所以我已经更新了我的路线,现在需要更新我的博客控制器。目前看起来如下所示,但我不断收到未定义的变量博客,大概是因为它没有传递变量。我该怎么做? (更新的博客控制器有问题)
  • 控制器中需要 3 个方法:showAllshowByMonthshowBySlang。每条路线一个。
  • 您将错误的参数传递给视图。你应该总是通过$blogs
  • 谢谢大家,现在可以正常工作了,但是我需要根据活动页面显示不同的内容,我该怎么做?我已经更新了我的 blog.blade.php 代码。未定义变量:slug(查看:C:\xampp\htdocs\laravel\app\views\pages\blog.blade.php)
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2017-03-21
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多