资讯专栏INFORMATION COLUMN

打通Laravel和Yii2任督二脉

kohoh_ / 3116人阅读

摘要:于是直接暴力开干,找说明书查询。测试登录,果然不通。一般情况下,这时候应该遵照官方手册,开始建立自己相配套的数据库体系。数据库是连通了,出现了熟悉的错误找不到表。登入登出完全正常,终于可以和和和美美地住在一个小房子里了。

Yii2与Laravel相爱相杀已经很久了,导致广大PHP爱好者必须选边站队,生怕自己站错了阵营。作为一个已经上了Yii2贼船很久的人想换船是需要很大勇气的,能不能就在现有框架基础上尝尝Laravel的鲜,同时万一不合适还能及时回头是岸呢?无论如何我也要趟一趟这趟浑水,看看人们传说已久慕名已久的Laravel到底有多好,是不是真的比Yii2要好很多?

安装Laravel

安装过程很简单,照着说明书一步一步操作,只要执行

laravel new project_name

就很快建立了你的第一个Laravel项目。配好Apache,打开浏览器,你已经能看到第一个页面。作为职业PHP选手,第一件事情就是要看看这个页面是从哪里来的,答案很明显,就在/resources/views/welcome.blade.php当中,先不要管它这个blade是个什么鬼,其中的一段话吸引了我:

        @if (Route::has("login"))
            
        @endif

看来它是自带有登录注册系统的,但是我没有看到这个登录注册按钮。于是直接暴力开干,找说明书查询。书上有讲:

php artisan make:auth

终于看到了登录注册按钮。但是这时候肯定是连不通的,想也知道,我们还没有配数据库嘛。测试登录,果然不通。

一般情况下,这时候应该遵照官方手册,开始建立Laravel自己相配套的数据库体系。但是,我们偏偏不要遵循官方教程,因为我们自己已经有了我们已经有Yii2做好的数据库,为什么要另起炉灶呢?我们偏偏就要让Laravel使用Yii2建好的数据库,否则我那么多用户数据怎么办?就算我把Yii生成的user表里的数据导入Laravel自己建的数据库,那我将来想两边都共用怎么办?所以必须强制它们住在一个屋檐下!

配置Laravel数据库

查看Laravel代码,/config/database.php,其中有如下配置:

"mysql" => [
    "driver" => "mysql",
    "host" => env("DB_HOST", "127.0.0.1"),
    "port" => env("DB_PORT", "3306"),
    "database" => env("DB_DATABASE", "forge"),
    "username" => env("DB_USERNAME", "forge"),
    "password" => env("DB_PASSWORD", ""),
    "unix_socket" => env("DB_SOCKET", ""),
    "charset" => "utf8mb4",
    "collation" => "utf8mb4_unicode_ci",
    "prefix" => "",
    "strict" => true,
    "engine" => null,
],

但是直接更改这里是行不通的,很聪明,这跟我们Yii2里的config/main.php是异曲同工之妙,Laravel把与环境相关的数据库配置放在了/.env文件里,而.env文件是被.gitignore了的,完全等价于Yii2的config/main-local.php。明白了这个就好办了,修改/.env文件:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mydatabase
DB_USERNAME=root
DB_PASSWORD=

刷新页面,重新登录。数据库是连通了,出现了熟悉的错误:找不到users表。

让Laravel使用Yii2的数据库表

这是因为Yii2自己建立的用户表名字叫user,而Laravel想找的表是users,差一个字母。那我们是不是要把表名改成users或者再给它新建一个users表呢?No, no, no。那样就失去了我们今天课程的精髓,我们偏偏就要让Laravel来使用Yii2的user表。

Laravel是把自己的model文件保存在app目录下的,我们在这个目录里可以找到一个文件叫做:/app/User.php。在这个文件里,我们来给它进行一点小小的改造,加上这么一行:

protected $table = "user";

我想你应该明白这是什么意思。于是乎,Laravel不再试图去从它想找的users表里找用户,而改从我们告诉它的user表里找用户。但是,不要高兴得太早,你依然是登录不进去的,因为表虽然对了,但是列不一定对,因为我们的Yii2是把密码哈希值存储在password_hash列里,而Laravel缺省要找的是password列,所以我们还要通过User.php文件告诉Laravel请你从password_hash列里找密码:

public function getAuthPassword()
{
    return $this->password_hash;
}

不止如此,Laravel选择当用户记住密码时保存token的列叫作remember_token,而Yii2叫作auth_key,这两者也不一样,于是你还需要再加上:

public function getRememberTokenName()
{
    return "auth_key";
}

再试一下,你已经可以用你旧的Yii2用户的密码登录Laravel系统了!

无法登出

问题总是一个接着一个,虽然可以登录了,但是还是无法登出,登出会报一个错误,原因是因为上面那一列auth_key,Yii2在建表的时候,缺省给的是一个32位长的字符串,而Laravel需要更长。所以我们多少还是需要小动一下我们的数据库结构,鉴于此,我们通过Yii2的migration来管理我们所有数据库的修改:

./yii migrate create alter_user_authkey_column

Yii2系统会帮我们在/console/migrations下自动生成一个文件,我们只需要简单修改一下就好了:

use yiidbSchema;
use yiidbMigration;

class m170523_060237_alter_auth_key_column_from_user_table extends Migration
{
    public function safeUp()
    {
        $this->alterColumn("user", "auth_key", Schema::TYPE_STRING . "(100) NOT NULL");
    }

    public function safeDown()
    {
        $this->alterColumn("user", "auth_key", Schema::TYPE_STRING . "(32) NOT NULL");

        return false;
    }
}

safeUp是指向上升级的时候要做的动作,safeDown是指万一失败了回退时的动作。

因为我们数据库中已经有user表了,所以我们不能再执行对于user表的migration动作,所以需要先告诉Yii2我们已经执行过user表的migration了,不要再执行:

./yii migrate/mark 130524_201442

好了,现在再执行./yii migrate就可以看到你想要的结果了。

登入登出完全正常,Laravel终于可以和Yii2和和美美地住在一个小房子里了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22986.html

相关文章

  • css3 flex弹性盒子布局梳理,打通任督二脉

    摘要:挺早就接触了的布局,深入使用也就是在近期移动端开发。属性用于设置或检索弹性盒模型对象的子元素如何分配空间。所以,项目之间的间隔比项目与边框的间隔大一倍。默认值是,也就是不进行缩放,占原来元素内容宽度大小。  挺早就接触了css的flex布局,深入使用也就是在近期移动端开发。老来多健忘,只能自己梳理一下知识点,当做温故知新吧。 ,请原谅小白的才疏学浅,写的不到位的地方请指正。   flex属性...

    Yumenokanata 评论0 收藏0
  • UCloud推出Rome全球网络加速产品,实现全球多云互联

    摘要:微软雅黑宋体正如这款产品的名字一样,相信条条大路通罗马,罗马全球网络加速产品依托于全球数据中心,为用户提供就近接入链路动态调度,能够实现端到端的高稳定连接,规避网络故障实现多云互联,多云灾备。我们已经身处数字经济时代,数字经济要发展,自然离不开产业政策的扶持,以及产业生态的做强。不过从技术的维度来看,应用层面的提速才是一系列外部条件推动数字经济发展的有力支点。 不能承受的网络之轻 ...

    Tecode 评论0 收藏0
  • 后端开发者从零做一个移动应用(一)

    摘要:最近终于痛定思痛,做了一个应用,目前的产品确实很一般,但决定以此为起步,逐步完善逐步提高。是以提供游戏下载游戏礼包发放为核心的移动端应用。可以简单理解成一个游戏的应用市场。在写后端的时候,产出了一个基于的授权的。 移动互联网时代,我不想只当一个后端工程师,是时候学习一些新的东西了! 一直以来想要学习一些前端的知识,扩宽自己的技术栈,但是一直以来对前端都是进行了解,没有用一个产品把这些东...

    galaxy_robot 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<