Giới thiệu

Chú ý: Loạt bài viết này giả sử rằng bạn đã có kiến thức về MVC và cách Laravel triển khai khái niệm này. Nếu bạn muốn tìm hiểu về chủ đề này, hãy đọc loạt bài viết của tôi về MVC trong Laravel bắt đầu từ cài đặt Laravel 5.4.

 

Trong loạt bài này, tôi sẽ tạo một ứng dụng hoàn chỉnh sử dụng Laravel 5.4. Trong ứng dụng này, sẽ đề cập đến nhiều khái niệm của Laravel bao gồm Migrations, Authentication, FileSystem và Eloquent ORM.

Các bài viết trong loạt bài này:

  1. Phần 1 -- Tạo ứng dụng ToDo trong Laravel 5.4: Migrating Table, Controllers & Models

  2. Phần 2 -- Laravel 5.4 ToDo App: Thiết lập Authentication và ToDo Functionality

  3. Phần 3 -- Giới thiệu về Laravel dusk: kiểm thử ứng dụng Todo

Cái tôi sẽ tạo là gì?

Tôi sẽ tạo một ứng dụng ToDo với các chức năng sau:

  • Xác thực người dùng với đăng nhập và đăng ký

  • Chỉ người dùng đã được xác thực có thể thực hiện các hành động CRUD (Create, Read, Update, Delete)

 

Hãy bắt đầu với việc tạo một ứng dụng Laravel với tên todoapp

 

 

Tạo dự án Laravel

Để tạo một dự án Laravel với tên todoapp, chạy lệnh sau:

 

composer create-project laravel/laravel todoapp

Tạo Database

Tiếp theo, tôi sẽ tạo một database với tên todoapp trên server.

 

 

Sau khi tạo database, tôi sẽ cấu hình tệp tin .env cho database.

 

Mở thư mục của dự án, sau đó mở tệp tin .env trong trình soạn thảo. Thêm thông tin cài đặt cho database như sau:

 

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=todoapp

DB_USERNAME=root

DB_PASSWORD=

 

Bây giờ database đã sẵn sàng để sử dụng. Tiếp theo tôi sẽ tạo các migration table và sau đó migrate chúng.

Tạo các table cho Migration

Mặc định Laravel đã tạo sẵn 2 migration table (một là Users và một cho Password_resets). Tôi sẽ chỉnh sửa bảng Users và tạo một migration table mới là Todo.

 

Đầu tiên chỉnh sửa bảng Users. Mở tệp tin {{timestamp}}_create_users_table.php trong thư mục database/migrations. Tại thời điểm này phương thức up() sẽ trông như dưới đây:

 

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password',255);
        $table->rememberToken();
        $table->timestamps();
    });
}

 

Bây giờ hãy thêm một vài trường. Một cho userimage và trường thứ hai cho API key của nó.

 

Trước khi tiếp tục hãy tìm hiểu cái mà 2 phương thức up()down() làm trong tệp tin migration. Trong up(), tôi sẽ định nghĩa schema (lược đồ) cho bảng, và thêm các cột mới,... Trong down(), tôi sẽ làm các hành động đảo ngược (reverse) chẳng hạn như drop (xóa) bảng hay đảo ngược về các thay đổi trước đó.

 

Bây giờ tôi sẽ chỉnh sửa phương thức up():

 

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->string('userimage');
        $table->string('api_key')->nullable()->unique();
        $table->rememberToken();
        $table->timestamps();
    });
}

 

Việc chỉnh sửa bảng users đã hoàn tất, tiếp theo tôi sẽ tạo một migration table mới cho Todo bằng cách chạy lệnh sau trong thư mục todoapp:

 

php artisan make:migration create_todo_table

 

Khi lệnh trên kết thúc, một tệp tin migration sẽ được tạo. Tôi sẽ tạo một scheme trong phương thức up() của tệp tin này.

 

public function up()
{
    Schema::create('todo', function (Blueprint $table) {
        $table->increments('id');
        $table->string('todo');
        $table->string('description');
        $table->string('category');
        $table->integer('user_id')->unsigned();
        $table->timestamps();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

 

Trong bảng todo, tôi đã tạo một primary key (khóa chính), một cột todo và một cột description. Tôi cũng tạo một cột category và tạo một foreign key (khóa ngoài) trên user_id nó sẽ ánh xạ tới id của một người dùng trong bảng users. Cuối cùng, tôi cũng tạo 2 cột timestamps sử dụng phương thức timestamps(). Hai cột này sẽ tự động cập nhật bất cứ khi nào một todo được thêm hay thay đổi.

Migrating các bảng sử dụng Artisan

Hiện tại chúng ta đã tạo tất cả các migration cần thiết cho các bảng, tôi sẽ thực thi migration với một lệnh duy nhất:

 

php artisan migrate

 

Khi lệnh hoàn tất, tất cả các bảng sẽ được tạo trong database:

 

Chú ý:

 

Nếu lệnh trên thất bại và bạn nhận được lỗi Specified key was too long, có thể là bạn đang sử dụng một phiên bản MySQL cũ hơn 5.7. Trong trường hợp này, bạn cần định nghĩa default string length trong tệp tin AppServiceProvider.php (lưu trữ trong thư mục app/Providers). Mở tệp tin và thêm dòng code sau vào trước khai báo class.

 

use Illuminate\Support\Facades\Schema;

 

Và trong phương thức boot() của class, thêm dòng code sau:

 

Schema::defaultStringLength(191);

 

Bây giờ, thử chạy lại lệnh. Nó sẽ làm việc. Để biết rõ hơn tham khảo laravel-news.com

Tạo các Model và Controller

Bây giờ tôi đã có các bảng trong database. Tiếp theo tôi sẽ tạo các model cho các bảng. Model cho bảng Users đi kèm với cài đặt mặc định của Laravel. Model và controler cho bảng todo sẽ được tạo với một lệnh duy nhất:

 

php artisan make:controller TodoController --resource --model=Todo

 

Khi lệnh trên thực thi, nó sẽ hỏi bạn nếu Todo model chưa tồn tại. Khi bạn nhập yes, nó sẽ tạo model và liên kết nó với controller.

 

 

Khi lệnh kết thúc, controller và model đã sẵn sàng để sử dụng.

Chỉnh sửa các model

Todo model

Hãy bắt đầu thêm các cột fillable vào Todo model. Mở tệp tin Todo.php (trong thư mục app). Thêm dòng sau bên trong class:

 

protected $table = 'todo';

protected $fillable = ['todo','category','user_id','description'];

 

Đến đây Todo model sẽ trông như thế này:

 

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Todo extends Model
{
    protected $table = 'todo';
    protected $fillable = ['todo','category','user_id','description'];
}

User model

Tiếp theo, tôi sẽ chỉnh sửa Users model và thêm cột user_image vào trong fillable của nó. Ngoài ra, tôi sẽ định nghĩa quan hệ với Todo model. Mở tệp tin User.php và thực hiện các thay đổi sau:

  • Đầu tiên, thêm user_image bên trong mảng $fillable.

  • Thứ hai, tạo một phương thức public todo(), nó sẽ tạo quan hệ một - nhiều với với bảng todo.

public function todo()
{
     return $this->hasMany('App\Todo');
}

 

Phương thức hasMany() định nghĩa quan hệ một - nhiều trong Eloquent.

 

Tại điểm này, tệp tin User.php mới sẽ trông như thế này:

 

<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
    use Notifiable;
    /**
    * The attributes that are mass assignable.
    *
    * @var array
    */
    protected $fillable = [
        'name', 'email', 'password','userimage'
    ];
    /**
    * The attributes that should be hidden for arrays.
    *
    * @var array
    */
    protected $hidden = [
        'password', 'remember_token',
    ];
    /*
    * Get Todo of User
    *
    */
    public function todo()
    {
        return $this->hasMany('App\Todo');
    }
}

Tổng kết phần 1

Trong phần này, tôi đã tạo một ứng dụng Laravel mới, với database, migration table cho todo và chỉnh sửa users migration table. Tiếp theo tôi đã migrate tất cả các bảng trong database sử dụng Artisan (giao diện dòng lệnh của Laravel). Sau đó tạo và chỉnh sửa các controller và model liên quan.

Cái tôi sẽ làm trong phần tiếp theo?

Trong phần tiếp theo, tôi sẽ tạo authentication cho người dùng sử dụng Artisan và chỉnh sửa nó cho ứng dụng todo. Tôi cũng sẽ chỉnh sửa TodoController và thiết lập nó để thực hiện CRUD. Tôi cũng sẽ tạo các views, và chỉnh sửa các item của todo.

Tham khảo

Link bài viết gốc https://www.cloudways.com/blog/create-todo-app-laravel-5-4/

 

Bài liên quan Laravel vs Symfony - Cuộc chiến của các framework

Khóa học lập trình PHP 7 Laravel 5.5 đào tạo trên dự án thực tế, trực quan và đảm bảo việc làm.