Отображение данных в представлении на основе сеанса - PullRequest
1 голос
/ 03 ноября 2019

У меня есть таблица постов с языковым столбцом "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'));
}

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Это потому, что нет значения сеанса с ключом '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')->...
1 голос
/ 03 ноября 2019

Получить текущую локаль из экземпляра приложения и отступить до 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'));
}

Надеюсь, это поможет

...