iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 6
1
Modern Web

Laravel學習系列 第 6

LARAVEL學習 DAY 6 CRUD 這次來真的

LARAVEL學習 DAY 6 CRUD 這次來真的

懶懶der 先卡一個
星期一是我課最滿的一天

聽說已經過了1/5 頭過身就過 抱歉我只是改了標題 內文還沒補

前言(與本篇無關的工商時間)

之前說Laravel Wagon壞掉只是烏龍一場 他其實棒棒的 有類Linux指令的Cmder還有內建Git 然後比那個醜醜的cmd跟PowerShitPoserShell還要好看 顏色上也比Git Bash還要舒服一些 不過礙於時間問題就不多介紹了 它其實非常好上手 不要看它胖胖的 用起來可方便了

另外再推兩個利用Docker建立的環境 其中一個是台灣之光啊
D-Laravel
Laradock
不過依然因為時間問題就不多加介紹了 D-Laravel有提供官方文件
但是我認為Laradock有更好的擴充性

對了 編輯器我用Visual Studio Code

可能會用到的擴充 其實有點肥有點慢...
可以考慮只裝Laravel Blade Snippets跟Laravel Snippets

前言

本篇沒有前言 上一篇講完了
不對... 請各位拜讀一下這篇文章
胖胖Model減重的五個方法
這讓我們更容易的來針對專案進行維護 讓我們的檔案切得更細 讓檔案像齒輪一樣 互相契合 而不是雜亂無章

正篇

想必大家被環境折騰了幾天 應該都沒問題了... 反正也沒有人有環境的問題來留言(幫邊緣人QQ)
對了 關於這次鐵人的內容我都會放在GitHub上 請大家多多參考

讓我先new個專案... 有現成的新環境的可以不用打了
laravel new it-ironman-9th
對了對了 用git clone指令抓下來的Laravel專案是不能直接執行的 除了環境與WebServer調整之外還需要進行以下指令

composer install
cp .env.example .env
php artisan key:generate

其中第一行為利用Composer來安裝該專案的PHP套件
第二行為將.env.example複製為.env檔案來進行環境的設定
第三行為 為專案產生一組key以供部分加密使用

之後視需求進行資料庫遷移
php artisan migrate

讓我們來看看裡面寫了什麼

APP_NAME=Laravel // 專案名稱 可利用env()函數進行呼叫
APP_ENV=local // 環境 local develop production
APP_KEY= // 使用上面產生key的指令進行產生
APP_DEBUG=true // 是否使用debug來讓開發者看到更多錯誤資訊
APP_LOG_LEVEL=debug // log等級
APP_URL=http://localhost // URL設置 同APP_NAME

// 資料庫連接部分
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

// 其他相關driver設定
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync

// Redis設定
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

// EMAIL寄信設定
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

// 沒用過... 有興趣的歡迎Google後留言讓大家長知識
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

// 當然也可以添加額外環境變數供專案使用

裡面不能註解 別學我用//...

好 真的要開始了
抱歉 等等文章會有點順序錯亂 我已經盡量調回來了...

Laravel官方提供了很好用的artisan command來讓專案開發更順利
對了 指令也可以縮寫 比如說剛剛的php artisan key:generate可以縮寫成php artisan k:g 但是我會盡量以它的真面目來寫

以下前置動作 根據文章開頭所說的 胖胖的Model只是個誤會
基本上Laravel的Model在我的認知上屬於Entity
所以我們為了不要讓它太亂 新增一個資料夾app\Entities
之後將app\User.php放進去 變成app\Entities\User.php
但是由於內建的一些依賴關係 我們還需要改到config\auth.php這個檔案 如果覺得太麻煩可以把它放回去...
在檔案的70行 我們會看到'model' => App\User::class, 請修改成'model' => App\Entities\User::class,
然後在app\Entities\User.php的第三行namespace App;請改成namespace App\Entities;
就這樣而已

再來 我們來建立一個新的Model
php artisan make:model Entities/CRUD -m
對了 檔案命名規則為大駝峰
然後

注意斜線方向...

注意斜線方向...

注意斜線方向...

為什麼要講三次我就不說了啦 大家慢慢體會 都是Windows陰我

這指令看起來很好懂 創建一個Model 名字叫做CRUD 那後面的-m參數呢?
就是順便建立一個遷移 讓你省下這個指令
php artisan make:migration create_c_r_u_ds_table
其實它的名稱識別很神 基本上都會照著SQL的規範走 用"_"區隔 大小寫有別 然後都會加s 有的還會改ies 大家可以多試試看

所以這個指令總共會產生兩個檔案

  1. app\Entities\CRUD.php
  2. database\migrations\2017_12_26_174415_create_c_r_u_ds_table.php // 有夠醜

我們來讓這兩個檔案進行一些神奇的結合(誤)

<?php
// app\Entities\CRUD.php

namespace App\Entities;

use Illuminate\Database\Eloquent\Model;

class CRUD extends Model
{
    protected $fillable = [
        'title', 'content',
    ];
}

利用protected來進行變數宣告 關於public private protected有請Google大神...
http://lmgtfy.com/?q=php+public+private+protected

再來就是fillable部分 宣告哪些欄位可以被填入 注意哦 沒有宣告到 你會找錯找到死... 因為很難想到是這個檔案的問題

另外還有其他的變數
如$table來定義對應資料表名稱
$timestamps = false來關閉內建的時戳欄位(created_at, updated_at)
還有$hidden來讓一些敏感的東西不隨著資料查詢的時候一併吐出來

接下來讓我們到migration的部分

<?php
// database\migrations\2017_12_26_174415_create_c_r_u_ds_table.php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCRUDsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('c_r_u_ds', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('content');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('c_r_u_ds');
    }
}

這個部分就要參考會需要用到什麼型態的欄位
https://laravel.com/docs/5.5/migrations#columns
我們在約18行的地方加了兩個string欄位

接下來 舉起你的手 甩一甩 動一動 要下指令了
php artisan migrate
如果你的環境正確的話應該會在資料庫看到資料表已經出現了
記得先建資料庫... 我剛忘記了 然後我使用的是adminer來進行簡易的網頁管理 有些人可能習慣下指令 、phpMyAdmin、Navicat(Windows)、Sequel Pro(macOS)等

在這裡會遇到的錯可能有
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
的錯誤

這是因為Laravel在5.幾我又忘了... 修改了關於欄位長度的設置
文章在這邊(看來是5.4)
懶得點進去的就看我表演吧

檔案路徑在這裡app/Providers/AppServiceProvider.php

注意看我的6跟17行

然後砍掉原本生成一半的資料表再migrate一次就可以了
或者打php artisan migrate:fresh來讓它重建

抱歉 這次的文章內容稍長 所以還是需要拖到下一篇 非常抱歉

結語

真的很對不起各位 文章一拖再拖 然後又隨便亂切
因為最近真的是有點忙不過來
接下來的規劃大概是 下一篇把CRUD Web的部分講完 再下一篇直接講完Api 這樣子

然後非常感謝Laravel社群的紅人 范聖佑大大來訪並訂閱 而且似乎相當關心自己的Laravel Dojo跟Laravel Wagon XDD


上一篇
LARAVEL學習 DAY 5 CRUD大小事 其實都是小事 - 今天不講CRUD
下一篇
LARAVEL學習 DAY7 CRUD(續) 關於路由與CONTROLLER建立
系列文
Laravel學習30

尚未有邦友留言

立即登入留言