打通Laravel和Yii2任督二线
时间:2023-03-29 18:52:35
PHP
Yii2和Laravel相爱相杀已久,导致广大PHP爱好者纷纷选边站,生怕站错阵营。作为一个长期在Yii2贼船上的人,换船需要很大的勇气。能不能在现有框架的基础上尝试一下Laravel的新鲜感,同时如果不合适可以及时回头?不管怎么说,这趟浑水也得去趟一趟,看看人家推崇已久的Laravel究竟比Yii2好多少?安装Laravel安装过程非常简单。按照说明逐步操作。只需执行laravelnewproject_name即可快速创建您的第一个Laravel项目。配置Apache,打开浏览器,已经可以看到第一页了。作为一个专业的PHP玩家,首先要做的就是看看这个页面是从哪里来的。答案很明显,就在/resources/views/welcome.blade.php里,不用管这个blade是什么鬼,其中有一段引起了我的注意:@if(Route::has('login'))@if(Auth::check())主页@else登录注册@endif
@endif好像有登录注册系统,但是我没有看到这个登录注册按钮。于是直接上暴力找说明书查。书上说:phpartisanmake: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','collat??ion'=>'utf8mb4_unicode_ci','prefix'=>'','strict'=>true,'engine'=>null,],但是直接改这里不行,很聪明,这个类似于我们在Yii2中的config/main.php,Laravel将环境相关的数据库配置放在/.env文件中,.env文件为.gitignore,完全等同于Yii2的config/main-local.php。明白了这个好办,修改/.env文件:DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=mydatabaseDB_USERNAME=rootDB_PASSWORD=刷新页面重新登录。数据库已连接,出现熟悉的错误:找不到用户表。让Laravel使用Yii2的数据库表。这是因为Yii2创建的user表的名字是user,而Laravel要找的表是users,少了一个字母。那我们是要把表名改成users还是新建一个users表呢?不不不。那样就失去了我们今天课程的精髓,不得不让Laravel使用Yii2的用户表。Laravel将自己的模型文件保存在app目录中。我们可以在该目录中找到一个名为:/app/User.php的文件。在这个文件中,让我们稍微修改一下,添加这一行:protected$table="user";我想你应该明白这意味着什么。所以,Laravel不再尝试从它要查找的users表中查找用户,而是从我们告诉它的user表中查找用户。不过,不要太高兴,你还是登录不上去,因为虽然表是对的,但是列不一定是对的,因为我们的Yii2在password_hash列中存储了密码哈希值,Laravel通过默认是密码列,所以我们要通过User.php文件告诉Laravel要求你从password_hash列中找到密码:publicfunctiongetAuthPassword(){return$this->password_hash;}不仅如此,Laravel选择当用户记住密码时,保存token的列叫remember_token,Yii2叫auth_key,两者不同,所以需要加上:publicfunctiongetRememberTokenName(){return'auth_key';}再试试,已经可以用了你的Yii2老用户密码登录Laravel系统了!无法登出的问题总是一个接一个。虽然您可以登录,但您仍然无法注销。注销时会报错。原因是上面那一列auth_key,在Yii2建表的时候,默认是一个32位长度的字符串,而Laravel要求更长。所以我们仍然需要稍微移动一下我们的数据库结构。鉴于此,我们通过Yii2migration来管理我们所有的数据库修改:./yiimigratecreatealter_user_authkey_columnYii2系统会在/console/migrations下自动为我们生成一个文件,我们只需要做一个简单的修改:使用yii\db\Schema;使用yii\db\Migration;classm170523_060237_alter_auth_key_column_from_user_tableextendsMigration{publicfunctionsafeUp(){$this->alterColumn('user','auth_key',Schema::TYPE_STRING.'(100)NOTNULL');}publicfunctionsafeDown(){$this->alterColumn('user','auth_key',Schema::TYPE_STRING.'(32)NOTNULL');返回假;}}safeUp是指升级时要采取的动作,safeDown是指失败时返回的动作。因为我们的数据库中已经有用户表了,我们不能再对用户表执行迁移动作了,所以我们需要告诉Yii2我们已经执行了用户表的迁移,不要再执行了:。/yiimigrate/mark130524_201442,现在执行./yiimigrate就可以看到想要的结果了。登录退出完全正常,Laravel终于可以和Yii2和谐相处了。