Laravel PHP

Laravel (2): Basic Task

FB公開社團 Larry的午茶時光
加入不需審核,歡迎讀者加入~
我的IG帳號: larry.time.taste。剛剛起步,歡迎大家追蹤~

https://laravel.com/docs/5.2/quickstart
(包含 CRUD 中的 create, read, delete)

# Preparing the database and ORM

php artisan make:migration create_tasks_table --create=tasks

會新增一 php file:
/database/migrations/year_month_date_randomNumber_create_tasks_table.php。
–create=tasks 的 “tasks” 是 table name。
注意專案裡不能有多個 class CreateTasksTable 的 migration php file, 待會下 artisan 指令會 error.

// in createddate_create_tasks_table.php
class CreateTasksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

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


Build the DB table specified in the “up” function:

php artisan migrate

Laravel 本身就提供 “users”, “password_resets” 基本會員系統需要的 DB schema, 再加上剛做好的 tasks table.

做好 DB schema 後,就要做 ORM class:

php artisan make:model Task

會生成 /app/Task.php:

// app/Task.php
class Task extends Model
{
    ...
}

不用明文指定這個 ORM class 對應哪個 table,默認對應到”模型名稱的複數型態”。就這個例子來說,對應到 table tasks。

# Routing and Views


加上 view, 定義 template:/resources/views/layouts/app.blade.php。

Laravel 使用 “Blade templating engine”.
https://laravel.com/docs/5.2/blade
他使用 {{  }} 嵌入變數,這會跟某些 JavaScript 框架衝突 (例如 Angular), 可以加上 @{{  }},雙大括號會 pass 到前端,由前端框架做 templating. 

加上 child view:/resources/views/tasks.blade.php。

/app/Http/routes.php 改成

Route::get('/', function () {
    return view('tasks'); // view('tasks') 會去找 /resources/views/tasks.blade.php
});

有個小地方紀錄一下,
https://laravel.tw/docs/5.2/quickstart#routing

Route::group(['middleware' => 'web'], function () {
    /**
     * 顯示所有任務
     */
    Route::get('/', function () {
        //
    });
});

會有這個問題 https://github.com/laravel/framework/issues/12022
將 Route::get 移至 global scope 就可以了 (不需要 Route::group([‘middleware’ => ‘web’], function ())

# DELETE method

Method Spoofing. The pattern:

<form action="{{ url('task/'.$task->id) }}" method="POST">
    {{ csrf_field() }}
    {{ method_field('DELETE') }}
</form>

Uses method_field(‘DELETE’) to spoof delete method,他傳到前端其實是:

<input type="hidden" name="_method" value="DELETE">

另外 Laravel 使用 Implicit Model Binding,在 router 中:

Route::delete('/task/{task}', function (Task $task) {
    $task->delete();
    ...
});

我們並未明文指定 delete method callback function 的 parameter (Task $task),可以”直接”在 callback function 填上你的 ORM class。

https://laravel.com/docs/5.2/routing#route-model-binding
Laravel will automatically resolve type-hinted Eloquent models defined in routes or controller actions whose variable names match a route segment name.

FB公開社團 Larry的午茶時光
加入不需審核,歡迎讀者加入~
我的IG帳號: larry.time.taste。剛剛起步,歡迎大家追蹤~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *