基于会话在视图中显示数据
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')->...
我有 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')->...