Yii2與Laravel相愛相殺已經好久了,致使廣大PHP愛好者必須選邊站隊,生怕本身站錯了陣營。做爲一個已經上了Yii2賊船好久的人想換船是須要很大勇氣的,能不能就在現有框架基礎上嚐嚐Laravel的鮮,同時萬一不合適還能及時懸崖勒馬呢?不管如何我也要趟一趟這趟渾水,看看人們傳說已久慕名已久的Laravel到底有多好,是否是真的比Yii2要好不少?php
安裝過程很簡單,照着說明書一步一步操做,只要執行mysql
laravel new project_name
就很快創建了你的第一個Laravel項目。配好Apache,打開瀏覽器,你已經能看到第一個頁面。做爲職業PHP選手,第一件事情就是要看看這個頁面是從哪裏來的,答案很明顯,就在/resources/views/welcome.blade.php
當中,先不要管它這個blade是個什麼鬼,其中的一段話吸引了我:laravel
@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
看來它是自帶有登陸註冊系統的,可是我沒有看到這個登陸註冊按鈕。因而直接暴力開幹,找說明書查詢。書上有講:git
php artisan make:auth
終於看到了登陸註冊按鈕。可是這時候確定是連不通的,想也知道,咱們尚未配數據庫嘛。測試登陸,果真不通。sql
通常狀況下,這時候應該遵守官方手冊,開始創建Laravel本身相配套的數據庫體系。可是,咱們恰恰不要遵循官方教程,由於咱們本身已經有了咱們已經有Yii2作好的數據庫,爲何要另起爐竈呢?咱們恰恰就要讓Laravel使用Yii2建好的數據庫,不然我那麼多用戶數據怎麼辦?就算我把Yii生成的user
表裏的數據導入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
文件:app
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=mydatabase DB_USERNAME=root DB_PASSWORD=
刷新頁面,從新登陸。數據庫是連通了,出現了熟悉的錯誤:找不到users
表。框架
這是由於Yii2本身創建的用戶表名字叫user
,而Laravel想找的表是users
,差一個字母。那咱們是否是要把表名改爲users
或者再給它新建一個users
表呢?No, no, no。那樣就失去了咱們今天課程的精髓,咱們恰恰就要讓Laravel來使用Yii2的user
表。yii
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和和美美地住在一個小房子裏了。