基于会话在视图中显示数据

Display data in view based on session

我有 table 个语言列为 "lang" 的帖子,我只想在视图中显示会话中存储的语言的帖子。

但我一直收到的只是默认语言 (Fr) 的帖子

控制器:

public function index(Request $request)

{
        if ($request->session()->has('en')) {
            $posts = Post::where('lang','=','En')
            ->with('author','tags','category','comments')
            ->latestFirst()
            ->filter(request()->only(['term', 'year', 'month']))
        }
        elseif ($request->session()->has('ar')) {
            $posts = Post::where('lang','=','Ar')
            ->with('author','tags','category','comments')
            ->latestFirst()
            ->filter(request()->only(['term', 'year', 'month']))
        }
        else  {
            $posts = Post::where('lang','=','Fr')
            ->with('author','tags','category','comments')
            ->latestFirst()
            ->filter(request()->only(['term', 'year', 'month']))
            }
  return view("blog.index", compact('posts'));
}

从应用实例获取当前语言环境并回退到Fr,因为它是默认设置

public function index(Request $request)
{
    $locale = ucfirst(app()->getLocale());
    $posts = Post::where('lang', $locale)
        ->with('author', 'tags', 'category', 'comments')
        ->latestFirst()
        ->filter(request()->only(['term', 'year', 'month']));
    return view("blog.index", compact('posts'));
}

希望对您有所帮助

那是因为没有带有键 'Ar' 或 'En' 的会话值。

你有2个选项。通过中间件或特征,您可以在需要时在控制器 类 中使用。

请注意,如果您使用我将要发布的这个选项,搜索机器人会发现它是一个问题,因为 URL 完全相同。对于我的项目来说这无关紧要,但它可以为你的。如果你不想要这个,你将不得不选择将它添加到你的路线中 (https://yourweb.site/en/your_urls)

如果您选择使用中间件,要更改您必须在任何路由中添加的语言 ?lang=en 或 ?lang=fr 仅一次,之后您的会话将记住选择。

中间件

namespace App\Http\Middleware;

use Closure;

class Language
{
    /**
     * The availables languages.
     *
     * @array $languages
     */
    protected $languages = ['en', 'ar', 'fr'];

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure                 $next
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->session()->has('lang'))
        {
            $request->session()->put('lang', $request->getPreferredLanguage($this->languages));
        }
        if ($request->has('lang'))
        {
            $request->session()->put('lang', $request->get('lang'));
        }
        app()->setLocale($request->session()->get('lang'));

        return $next($request);
    }
}

如果有新访客到来,他或她将以首选语言服务,在您的情况下为法语。对另一种语言的任何选择现在都保留为代码中任何位置的 session('lang')

$posts = Post::where('lang','=', session('lang', 'fr')->...