Laravel là framework PHP được phát triển và sử dụng rộng rãi trong vài năm trở lại đây, các version Laravel từ liên tục được cập nhật và nâng cấp đều đặn một năm vài lần. Tuy có cập nhật nhưng nói chung về việc sử dụng framework của developer không có gì thay đổi nhiều do cấu trúc thư mục của framework gần như vẫn xoay quanh các thành phần chính :
- Controllers
- Models
- Migrations
- Repositories
- Routes
- Views
Với một project CRUD cơ bản việc phải lặp lý lặp lại hành động tạo controller, models, repositories … khiến developer đôi khi thấy thực sự nhàm chán, chưa kể việc phải copy paste giao diện html từ module này sang module khác mà chỉ thay thế mỗi cái tên, hoặc tiêu đề. Hơn nữa việc setup các package, theme tốn rất nhiều thời gian. Để giải quyết vấn đề này trong bài viết hôm nay mình xin giới thiệu package Infyom, một package laravel mạnh mẽ cho phép auto generate gần như tất cả những gì được coi là nhàm chán nhất trong một project laravel.
Infyom cho phép sử dụng command line đơn giản để generate api doc, controller, migration, model … và thậm chí là cả theme admin LTE, bootstrap, metronic … Hãy hình dung chỉ cần vài command đơn giản bạn đã tạo được một màn hình quản lý user có sẵn các chức năng thêm, sửa, xóa, sắp xếp, phân trang … Quá nhàn phải không? Hiện nay blade của laravel đang dần được thay thế bằng các thư viện Front-end có trải nghiệm tốt hơn như ReacJS, Vuejs … nên phần đáng chú ý của Infyom là auto-generate CRUD api. Chúng ta cùng xem nó có gì.
1. Setup
Việc setup Infyom hoàn toàn tương tự như các package của laravel khác.
Hiện tại version của Infyom được cập nhật liên tục cho phù hợp với version tương ứng của Laravel. Cho nên bạn đang dùng version laravel nào thì dùng version Infyom tương ứng. Vì laravel 8 vừa ra lò nên Infyom chưa kịp cập nhật, hiện tại đang là version Infyom 7.
Có thể trong tối nay v8 sẽ có
1 2 3 4 | <span class="token property">"require"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"infyomlabs/laravel-generator"</span><span class="token operator">:</span> <span class="token string">"7.0.x-dev"</span> <span class="token punctuation">}</span> |
1 2 3 | composer install php artisan vendor:publish |
Tiếp theo là mở appProvidersRouteServiceProvider.php
và sửa mapApiRoutes
như sau:
1 2 3 4 5 6 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">prefix</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'api'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">middleware</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'api'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token keyword">as</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'api.'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token keyword">namespace</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token keyword">namespace</span><span class="token punctuation">.</span><span class="token double-quoted-string string">"\API"</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">group</span><span class="token punctuation">(</span><span class="token function">base_path</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'routes/api.php'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Việc này sẽ cho phép chúng ta phân tách các controller liên quan đến API sẽ được tự động generate trong thư mục Http/Controllers/API.
Tiếp theo nếu bạn muốn tạo ra các thư mục làm việc cơ bản cho dự án thì chỉ cần
1 2 | php artisan infyom:publish |
Và cấu trúc thư mục của bạn sẽ tương tự như thế này, đó là có sẵn những file base và thư mục cần thiết
2. How to use ?
Cách sử dụng khá đơn giản chúng ta có thể tham khảo tại trang chủ https://labs.infyom.com/laravelgenerator/docs/7.0/introduction
Giống như những pakage khác sau khi publish chúng ta sẽ có một file rất quan trọng nằm trong config/infyom/laravel_generator.php
Trong đây chủ yếu là những option dạng true/false, nếu không cần dùng cái gì bạn chỉ cần để là false, ngược lại thì là true. Ví dụ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token single-quoted-string string">'options'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'softDelete'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'save_schema_file'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">true</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'localized'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'tables_searchable_default'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'repository_pattern'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">true</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'excluded_fields'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'id'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token comment">// Array of columns that doesn't required while creating module</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> |
Nếu muốn dùng softDelete cho table thì bạn cần chuyển nó sang true thay vì false như mặc định. Có một điểm yếu là bạn không có option command nào để chỉ định xem table nào sẽ có softDelete và table nào là không dùng softDelete. Nên trước khi khởi tạo table bạn cần vào config này để sửa thủ công.
Sau khi config xong chúng ta sẽ thử tạo api cho module với đầy đủ chức năng CRUD, ví dụ Category
1 2 | php artisan infyom:api Category |
Sau khi chạy lệnh trên nó sẽ hỏi chúng ta nhập vào các field của table vào
1 2 3 4 5 | Specify fields <span class="token keyword">for</span> the model <span class="token punctuation">(</span>skip <span class="token function">id</span> <span class="token operator">&</span> timestamp fields, we will <span class="token function">add</span> it automatically<span class="token punctuation">)</span> Read docs carefully to specify field inputs<span class="token punctuation">)</span> Enter <span class="token string">"exit"</span> to finish Field: <span class="token punctuation">(</span>name db_type html_type options<span class="token punctuation">)</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>: |
trong đó:
- name: là tên field, ví dụ: category_name
- db_type: kiểu dữ liệu, ví dụ:
string
. Nếu muốn thêm số lượng ký tự thì nhậpstring,255
- html_type: là kiểu html trong form, ví duj: input, textarea …
- options: thông tin bổ sung nếu có, cái này thường bỏ qua.
Tiếp theo infyom sẽ hỏi bạn về validation của field này ví dụ : required, unique …
1 2 3 | Enter validations: <span class="token punctuation">[</span><span class="token punctuation">]</span>: <span class="token operator">></span> required |
Nếu không muốn nhập thêm bất kỳ field nào nữa thì bạn chỉ cần nhất Enter
để bỏ qua.
Sau khi tạo xong, danh sách các file được tạo sẽ như thế này, bao gồm cả file migration
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | <span class="token operator">></span> infyom php artisan infyom:api Category Specify fields <span class="token keyword">for</span> the model <span class="token punctuation">(</span>skip <span class="token function">id</span> <span class="token operator">&</span> timestamp fields, we will <span class="token function">add</span> it automatically<span class="token punctuation">)</span> Read docs carefully to specify field inputs<span class="token punctuation">)</span> Enter <span class="token string">"exit"</span> to finish Field: <span class="token punctuation">(</span>name db_type html_type options<span class="token punctuation">)</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>: <span class="token operator">></span> category_name string input Enter validations: <span class="token punctuation">[</span><span class="token punctuation">]</span>: <span class="token operator">></span> required Field: <span class="token punctuation">(</span>name db_type html_type options<span class="token punctuation">)</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>: <span class="token operator">></span> status integer input Enter validations: <span class="token punctuation">[</span><span class="token punctuation">]</span>: <span class="token operator">></span> required Field: <span class="token punctuation">(</span>name db_type html_type options<span class="token punctuation">)</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>: <span class="token operator">></span> Migration created: 2020_10_04_070331_create_categories_table.php Model created: Category.php Repository created: CategoryRepository.php Factory created: CategoryFactory.php Create Request created: CreateCategoryAPIRequest.php Update Request created: UpdateCategoryAPIRequest.php API Controller created: CategoryAPIController.php categories api routes added. RepositoryTest created: CategoryRepositoryTest.php ApiTest created: CategoryApiTest.php Schema File saved: Category.json Do you want to migrate database? <span class="token punctuation">[</span>y<span class="token operator">|</span>N<span class="token punctuation">]</span> <span class="token punctuation">(</span>yes/no<span class="token punctuation">)</span> <span class="token punctuation">[</span>no<span class="token punctuation">]</span>: <span class="token operator">></span> <span class="token function">yes</span> Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table <span class="token punctuation">(</span><span class="token number">0.1</span> seconds<span class="token punctuation">)</span> Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table <span class="token punctuation">(</span><span class="token number">0.11</span> seconds<span class="token punctuation">)</span> Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table <span class="token punctuation">(</span><span class="token number">0.06</span> seconds<span class="token punctuation">)</span> Migrating: 2020_10_04_070331_create_categories_table Migrated: 2020_10_04_070331_create_categories_table <span class="token punctuation">(</span><span class="token number">0.06</span> seconds<span class="token punctuation">)</span> Generating autoload files |
Hệ thống sẽ hỏi bạn có muốn chạy migrate để tạo database không, bạn có thể chọn Yes/No. Ở đây mình chọn Yes và do dự án mới tạo nên nó chạy luôn cả những file migation đang có sẵn.
Tuy nhiến cần chú ý, nếu sau khi gõ yes mà bạn gặp bất kỳ lỗi nào ví duj: lỗi chưa tạo database, không connect được … Thì sau khi khắc phục lỗi, bạn cần chạy migation bằng lệnh của laravel như bình thường.
1 2 | php artisan migrate |
Vậy là khơi tạo thành công những file cần thiết cho dự án, hơn nữa khi mở những file này ra đã có sẵn luôn code CRUD cho các bạn, việc cần làm là edit lại theo nhu cầu và sử dụng là được.
Rồi, nhưng đôi khi bạn làm sai và muốn thao tác lại từ đầu thì sao, Infyom cung cấp cho bạn lệnh rollback để hoàn tác những việc vừa làm
1 2 | php artisan infyom:rollback <span class="token variable">$MODEL_NAME</span> <span class="token variable">$COMMAND_TYPE</span> |
Trong đó :
- $MODEL_NAME: Tên Model ở đây của mình là Category
- $COMMAND_TYPE : api, scaffold hoặc api_scaffold, ở ví dụ của mình là
api
Tuy nhiên lại có một điều không vui lắm là nếu bạn đã chạy file migration thì việc rollback này sẽ không delete table đó trong database đi, mà muốn delete table trong db đi thì bạn phải chạy lệnh
migration:rollback
của laravel trước. Thật không hiểu lắm về dụng ý của nhà phát triển Infyom =)). Tuy nhiên bù lại khi nhìn trong đống file mà Infyom tạo ra bạn sẽ rất vui, vì đây là công việc mà developer nào cũng ghét đó là viết Test. Infyom đã viết test luôn cho bạn cả controller lẫn repository rồi. (Phê)
Ngoài ra nếu không muốn tạo luôn các file như vậy, bạn có thể tạo riêng lẻ từng file bằng những command mà Infyom cung cấp dưới đây:
Tạo migration
1 2 | php artisan infyom:migration <span class="token variable">$MODEL_NAME</span> |
Tạo model
1 2 | php artisan infyom:model <span class="token variable">$MODEL_NAME</span> |
Tạo controller
1 2 | php artisan infyom.api:controller $MODEL_NAME |
Tạo repository
1 2 | php artisan infyom:repository $MODEL_NAME |
Tạo request
1 2 | php artisan infyom.api:requests $MODEL_NAME |
Tạo test
1 2 | php artisan infyom.api:tests $MODEL_NAME |
Ngoài ra còn nhiều command khác liên quan đến tạo template, tuy nhiên trong phạm vi bài này mình không đề cập, các bạn có thể tham khảo thêm ở trang chủ của Infyom https://labs.infyom.com/laravelgenerator/docs/7.0/generator-commands
Tạo relationship
1 2 | php artisan infyom:api_scaffold Post --relations |
Phần này khá dài các bạn có thể đọc thêm trong https://labs.infyom.com/laravelgenerator/docs/7.0/relationships nhé. Có hết những quan hệ mà bạn cần và khi khởi tạo table Infyom sẽ tự động tạo ra cho bạn luôn.
3. Kết luận
Như vậy là mình đã giới thiệu cho các bạn một package khá hay giúp giảm thiểu những công việc nhàm chán trong quá trình viết code, hy vọng các bạn sẽ đem infyom áp dụng vào dự án của mình để cùng trải nghiệm. Một package dù xịn như nào thì cũng sẽ tồn tại điểm mạnh và yếu, hy vọng là các bạn sẽ biết cách áp dụng đúng lúc đúng chỗ tùy thuộc vào hoàn cảnh của dự án. Thanks!