php - 语言切换器仅在 Artisan serve 运行时工作

标签 php laravel laravel-5.4

我找到了一篇关于制作多语言 Laravel 网站的文章 here ,它就像一个魅力。

但是当我没有运行 php artisan serve(例如在我的托管服务上)时,切换语言会重定向到“original_language/lang/destination_language”并给我一个 404 RouteNotFound :

NotFoundHttpException in RouteCollection.php line 179:
in RouteCollection.php line 179
at RouteCollection->match(object(Request)) in LanguageController.php line 
22
at LanguageController->switchLang(object(Request), 'fr')
at call_user_func_array(array(object(LanguageController), 'switchLang'), 
array('request' => object(Request), 'lang' => 'fr')) in Controller.php 
line 55
at Controller->callAction('switchLang', array('request' => 
object(Request), 'lang' => 'fr')) in ControllerDispatcher.php line 44
at ControllerDispatcher->dispatch(object(Route), 
object(LanguageController), 'switchLang') in Route.php line 204
at Route->runController() in Route.php line 160
at Route->run() in Router.php line 559

我完全不知道它来自哪里。这是我的 LanguageController.php 方法 switchLang() :

public function switchLang(Request $request, $lang)
{
    // Store the URL on which the user was
    $previous_url = url()->previous();

    // Transform it into a correct request instance
    $previous_request = app('request')->create($previous_url);

    // Get Query Parameters if applicable
    $query = $previous_request->query();

    // In case the route name was translated
    $route_name = app('router')->getRoutes()->match($previous_request)->getName();

    // Store the segments of the last request as an array
    $segments = $previous_request->segments();

    // Check if the first segment matches a language code
    if (array_key_exists($lang, config('translatable.locales'))) {

        // If it was indeed a translated route name
        if ($route_name && Lang::has('routes.'.$route_name, $lang)) {

            // Translate the route name to get the correct URI in the required language, and redirect to that URL.
            if (count($query)) {
                return redirect()->to($lang . '/' .  trans('routes.' . $route_name, [], $lang) . '?' . http_build_query($query));
            }

            return redirect()->to($lang . '/' .  trans('routes.' . $route_name, [], $lang));
        }

        // Replace the first segment by the new language code
        $segments[0] = $lang;

        // Redirect to the required URL
        if (count($query)) {
            return redirect()->to(implode('/', $segments).'?'.http_build_query($query));
        }

        return redirect()->to(implode('/', $segments));
    }

    return redirect()->back();
}

希望对您有所帮助。谢谢!

(我能感觉到这是根/公用文件夹路由问题,但我找不到位置)

最佳答案

这个问题我花了很长时间才解决。

你有两个选择:

  1. 在您的操作系统上创建单独的域,并确保从路径中删除 public。
  2. 将您的项目上传到与我合作的真实域中。

关于php - 语言切换器仅在 Artisan serve 运行时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43427090/

相关文章:

php - 关系字段上的排序依据

laravel - 在 null 上调用成员函数 store() - laravel 5.4

javascript - 使用 laravel 动态数据和灯箱

laravel - 仅为生产设计 500 错误页面

php - cake php中的SQL删除查询不影响行

javascript - 有什么方法可以从 PHP 中的字符串中删除所有 javascript 吗?

php - 引用 - 这个错误在 PHP 中意味着什么?

php - Laravel Lumen - 处理无效路线

php - 复杂的 Laravel 集合

php - 如何搜索多个 mySQL 表以找到一个特定的行?