Bonjour,

Je veux traduire mon site web en français et en anglais. J'ai préparer le terrain, en passent un paramètre globale dans tout mes route de mon appliicaton (web). Voila je rencontre un petit problème avec mon code.

Ce que je fais

Voici une portion des routes du groupe web avec le paramètre $locale


/**
 * We redirect the user on the default current local of the application.
 */
Route::redirect('/', '/'.locale()->current(), 301);

Route::prefix('{locale}')->group(function (){
    Route::get('/', 'PagesController@index')->name('welcome');

    Auth::routes('{locale}');

    Route::get('/confirm/{id}/{token}', 'Auth\RegisterController@confirm')->name('confirm');
    Route::get('/home', 'HomeController@index')->name('home');

    Route::get('/profile/{name}', 'UsersController@index')->name('public.profile');

    /**
     * Blog routes (public)
     */
    Route::group(['prefix' => 'blog', 'as' => 'blog.'], function (){
        Route::get('/', 'PostsController@index')->name('index');
        Route::get('/{slug}', 'PostsController@show')->name('single');
        Route::get('/category/{slug}', 'PostsController@Category')->name('category');
    });

    /**
     * Contact Routes (public)
     */
    Route::group(['prefix' => 'contact', 'as' => 'contact.'], function () {
        Route::get('/', 'ContactController@index')->name('index');
    });

    /**
     * Projects routes (public)
     */

    Route::group(['prefix' => 'projects', 'as' => 'project.'], function (){
        Route::get('/', 'ProjectsController@index')->name('index');
        Route::get('/{slug}', 'ProjectsController@show')->name('single');
        Route::get('/category/{slug}', 'ProjectsController@Category')->name('category');
    });

    /**
     * User backend
     */
    Route::group(['prefix' => 'my', 'as' => 'my.', 'middleware' => ['auth']], function (){
        Route::get('edit', 'UsersController@edit')->name('edit');
        Route::put('edit', 'UsersController@update')->name('update');
        Route::get('/carousel', 'CarouselsController@index')->name('carousel');
    });

Ce que je veux

Ce paramètre globale ne sois jamais perdu dans tout les reqêtes de mon application.

Ce que j'obtiens

Quand j'essais d'avoir accès à une page privée sans être connecté avant. J'obtien cette erreur suivant :
Missing required parameters for [Route: login] [URI: {locale}/login]. L'or de la redirection mon paramètre $locale n'est pas passé. Ma route qui s'appelle à une strucutre suivante :
Methode : GET|HEAD
Uri {locale}/login
Nome : login
Action : App\Http\Controllers\Auth\LoginController@showLoginForm
Middleware web,guest

Dans ce contrôlleur j'ai cette function showLoginForm() :
J'ai passé le paramètre $locale dans ma fonction. Ça ne fonctione pas.

public function showLoginForm(string $locale)
    {
        return view('auth.login');
    }

Dans mon menu je fait passer le paramètre $locale manuellement ça fonctione très bien :

 <a class="menu__link__right" href="{{ route('login', locale()->current()) }}">{{ __('Login') }}</a>

Ça me génére cette url :
demo.demo/en/login

Comment je peut caputer cette redirection vers la page login quand un utilisateur essais d'avoir accèe à une page sans être connecté.

Merci de votre aide.

3 réponses


Aecy
Réponse acceptée

Est-ce que tu as régardé ceci ? : https://laravel.com/docs/5.6/localization

lakamark
Auteur
Réponse acceptée

Merci de ton aide j'ai trouver finalement la solution. J'ai écouter quand le middleware Auth lance une execption AuthenticationException. Dans le fichier Handler dans le dossier Exception de mon application :

protected function unauthenticated($request, AuthenticationException $exception) {
        $isJsonRequest = $request->isJson();
        $defaultLocale = locale()->current();

        // If is a API REST request, we will return a json request with exception message
        if ($isJsonRequest) {
            return $request->json(['message' => $exception->getMessage()], 401);
        }

        // Else we will redirect the unauthenticated user go to login page.
        return redirect(route('login', $defaultLocale))
            ->with('error', "Sorry, you should to be authenticated to have to access to this page.");
    }

Parfait ! :D