打通Laravel和Yii2任督二脉

栏目: 编程语言 · PHP · 发布时间: 6年前

内容简介:打通Laravel和Yii2任督二脉

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'))
            <div class="top-right links">
                @if (Auth::check())
                    <a href="{{ url('/home') }}">Home</a>
                @else
                    <a href="{{ url('/login') }}">Login</a>
                    <a href="{{ url('/register') }}">Register</a>
                @endif
            </div>
        @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 yii\db\Schema;
use yii\db\Migration;

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和和美美地住在一个小房子里了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计原本

设计原本

Frederick P. Brooks, Jr. / InfoQ中文站、王海鹏、高博 / 机械工业出版社 / 2011-1-1 / 55.00元

无论是软件开发、工程还是建筑,有效的设计都是工作的核心。《设计原本:计算机科学巨匠Frederick P. Brooks的思考》将对设计过程进行深入分析,揭示进行有效和优雅设计的方法。 本书包含了多个行业设计者的特别领悟。Frederick P. Brooks, Jr.精确发现了所有设计项目中内在的不变因素,揭示 了进行优秀设计的过程和模式。通过与几十位优秀设计者的对话,以及他自己在几个设计......一起来看看 《设计原本》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器