Upgrading to Laravel 5.3 from 5.1 - 1st step

同时也是招新宣讲的演示demo

Posted on September 8, 2016 in Laravel Demo

本文基于=>基于Laravel开发博客应用系列 —— 十分钟搭建博客系统

  • Laravel 5.3中,使用

    php artisan make:controller BlogController --plain

    时可以省略--plain,因为现在默认生成的controller就是非restful风格了。不过目前我还是喜欢原来restful风格的controller。

  • 原教程是外国人写的,所以用到了slug,也就是去掉标题的标点,将单词用-连接,方便搜索引擎的检索,也就是通常建站所要考虑的SEO优化

但是这里就有问题了,英文单词可以用横线串起来,可以放倒链接里面,那中文怎么办?通常我们有两种做法。

  1. 什么也不做
  2. 用拼音

第一种方案会生成带有类似乱码的转义unicode后的链接,比如:
http://localhost/content/105244-%E3%80%8A%E9%A1%B9%E7%9B%AE%E7%BB%8F%E7%90%86%E9%A2%86%E5%AF%BC%E5%8A%9B%E3%80%8B%E7%A5%9E%E5%B7%9E%E5%B7%A8%E9%BE%99%E5%A4%A7%E5%9E%8B%E5%85%8D%E8%B4%B9%E8%AE%B2%E5%BA%A7
这样做并不美观,而且达不到seo的效果。

方案二是大多数网站会采用的方法。一般来说推荐此方法,但是我用了一个比较奇葩的方案。。。就是利用一些在线翻译把title翻译成英文,再变成slug。下面就来看看怎么做:

  • 首先,找一个在线翻译,比如某度 屏幕快照 2016-09-08 下午6.37.38.png

  • 然后看看它的翻译接口在哪 屏幕快照 2016-09-08 下午6.42.57.png

  • 可以看到返回的json的结构,然后看看应该怎样伪造请求 屏幕快照 2016-09-08 下午7.35.36.png

  • 现在清楚了,请求里面带5个参数,其中我们要翻译的中文放在query,其他的按图片中来就好,那么开始写代码

    function translateZHtoENG($string, $raw = false)
    {
    $data = [
        'from' => 'zh',
        'to' => 'en',
        'query' => $string,
        'transtype' => 'translang',
        'simple_means_flag' => '3',
    ];
    $query = http_build_query($data);
    $aContext = [
        'http' => [
            'method' => 'POST',
            'header' => 'Content-type: application/x-www-form-urlencoded',
            'content' => $query,
        ],
    ];
    
    $cxContext = stream_context_create($aContext);
    
    $sUrl = config('blog.api.translation'); //此处必须为完整路径
    
    $result = file_get_contents($sUrl, false, $cxContext);
    
    if (!$raw) {
        $result = json_decode($result, true)['trans_result']['data'][0]['dst'];
    }
    return $result;
    }
  • 如果是Laravel,可以封装成函数,在app目录下建个helpers.php,放好然后执行
    composer dumpauto
  • 这个文件在后面也会用到,用来存放一些全局的帮助函数。但是现在又有一个问题,如果输入全英文的title还去翻译,岂不是浪费流量?所以我们可以加个判断,比如
    if (preg_match("/[x{4e00}-x{9fa5}]/u", $value)) {
                $value = translateZHtoENG($value);
            }
  • 用正则表达式匹配中文,这样只有在title中出现中文时才翻译。自此,我们的slug就可以自动添加了。就算以后想换成拼音也很方便。