内容简介:打通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和和美美地住在一个小房子里了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何打通CMDB,实现就近访问
- 亿级“附近的人”,打通“特殊服务”通道
- 5分钟打通rollup.js副本
- 打通多个视觉任务的全能Backbone:HRNet
- Java笔记——看完这个,打通Spring难度系数
- 数据分析打通银行业的最后一公里
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
设计原本
Frederick P. Brooks, Jr. / InfoQ中文站、王海鹏、高博 / 机械工业出版社 / 2011-1-1 / 55.00元
无论是软件开发、工程还是建筑,有效的设计都是工作的核心。《设计原本:计算机科学巨匠Frederick P. Brooks的思考》将对设计过程进行深入分析,揭示进行有效和优雅设计的方法。 本书包含了多个行业设计者的特别领悟。Frederick P. Brooks, Jr.精确发现了所有设计项目中内在的不变因素,揭示 了进行优秀设计的过程和模式。通过与几十位优秀设计者的对话,以及他自己在几个设计......一起来看看 《设计原本》 这本书的介绍吧!