Trong bài viết 10 bước để cài đặt và xây dựng một Website với thư viện Lavavel chúng tôi đã hướng dẫn cách cài đặt một ứng dụng mẫu với FW Lavavel. Tiếp theo trong bài viết này chúng tôi hướng dẫn cách sử dụng 3 chủ thể chính trong mô hình MVC là Route - View - Controller với cách tiếp cận thông qua các ví dụ để dễ hiểu và thực hành.

Tổng quát về Router, Controller và View

Router

Được định nghĩa trong app-http-routes. Routes dùng để định nghĩa mối quan hệ giữa các đường dẫn (url), các liên kết (link) . Khi một liên kết được tạo ra bằng cách sử dụng tên của routes, thì một định danh liên kết thống nhất sẽ được tạo ra bởi laravel.

Chúng ta định nghĩa một routes như sau:

Route::get('/', "testController@index");
Route::get('{view}', function($view) {
    if (view()->exists($view)) {
        return view($view);
    }
    return app()->abort(404, 'Page not found!');
});

Với cách khai báo Route này chúng ta hiểu là action là index và controller là test

Controllers

Được định nghĩa trong app-http-Controller. Controller tổ chức nhóm tất cả các logic này trong class Controller để tiện xử lý. Vị trí của Controller là app/Http/Controllers. Trong thư mục Controller chúng ta tạo một tập tin testController.php và định nghĩa action index

<?php
namespace
App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
class testController extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
    public function index(){
        return view();
    }
}

Views

Được định nghĩa trong resources-views. Views chứa các mã html dùng để hiển thị nội dung được chỉ định bởi Controllers, vị trí của View trong ứng dụng Laravel là  resources/views. Chúng ta tạo trang test.blade.php (bạn sao chép mã HTML bên trang welcome.blade.php) rồi sửa chữ Lavavel thành Test.

<body>
<div class="container">
 <div class="content">
  <div class="title">Test</div>
 </div>
</div>
</body>
</html>

Chạy ứng dụng với đường dẫn http://localhost/laravel-master/test để xem kết quả ta sẽ thấy hiển thị views Test

Như vậy chúng ta thấy được sự lưu chuyển dữ liệu trong mô hình MVC của Lavavel khá đơn giản so với các thư viện khác đúng không.

Làm việc với Routes

Trong Lavavel Routes gồm có các loại sau:

·         Route::get phương thức GET

·         Route::post phương thức POST

·         Route::match kết hợp hiều phương phức

·         Route::any nhận tất cả các phương thức

·         Route::filter tạo ra bộ lọc nhằm mục đích nào đó, ví dụ tạo bộ lọc kiểm tra đã đăng nhập hay chưa

·         Route::group gom các route lại với nhau thành một nhóm

·         Route::controller gọi đến controller tương ứng

·         Route::resource sử dụng với resource controller

Route::get phương thức GET

Route này sẽ tiếp nhận các request với phương thức GET, cách sử dụng route này khá đơn giản.

Cú pháp: Route::get($uri, $action);

//trong đó $action có thể là 1 mảng, hàm hoặc 1 chuỗi

Có các trường hợp như sau:

Action là một hàm

Route::get('/demo',function(){
    return 'Đây là demo get routes';
});

Action là một mảng

Cú pháp:Route::get($uri,$array);

Route::get('/array',['name'=>'get.array','uses'=>'testController@test']);
//trong đó /array là uri
//get.array sẽ là tên của route này
//uses route này sẽ gọi đến phương thức test của testController

Action là một chuỗi

Route::get($uri, $string);

//trong đó $string có dạng: têncontroller@phươngthức

Đây là trường hợp đầu tiên trong phần giới thiệu

Route::post phương thức POST

Cú pháp và cách sử dụng tương tự GET. Bạn nên sử dụng get cho việc lấy dữ liệu như hiển thị bài viết, lấy dữ tiệu bằng ajax, ... Nên sử dụng post khi có thao tác thay đổi cơ sở dữ như thêm, xóa, hay sửa dữ liệu.

Route::match

Ngoài các method POST và GET phổ biến trong laravel còn có thêm PUT, PATCH, DELETE vậy nên sinh ra Route này.

Cú pháp:

Route::match($methods, $uri, $action);

$methods có thể là 1 mảng các method như ['GET', 'POST','PUT']

//$uri và $action giống như các route kể trên

Ví dụ: bạn bổ sung thêm routes

Route::match(['GET', 'POST','PUT'],'/match',function(){     return 'Demo match route'; });

Route::any

Cú pháp và cách sử dụng của loại route này không khác Route::get() là mấy, chỉ có điều route này nhận request với tất cả các method như: POST, GET, DELETE, ...Cú pháp: Route::any($uri, $action);

Route::controller

Việc sử dụng các route post, get, any, ... để gọi đến 1 action của controller, nhưng nếu bạn có nhiều controller mà mỗi controller lại có nhiều action thì chẳng lẽ mỗi action ta viết 1 dòng Route::method() hay sao. Trong trường hợp này chúng ta sử dụng 2 route khá quan trọng trong laravel là  Route::controller() và Route::resouce() có thể giải quyết vấn đề vừa nêu. Cú pháp: Route::controller($uri, $controller, $names);

Giả sử bạn có controller là pageController, controller này có 3 action khác nhau, nếu như theo bài trước thì cần phải viết 3 dòng cho 3 action của controller này. Nhưng nếu bạn sử dụng Route::controller() thì chỉ cần 1 dòng mà thôi:

Giả sử ta có 3 action như sau: File  app/controllers/pageController.php

<?php /**  * Created by PhpStorm.  * User: hphai  * Date: 3/1/2016  * Time: 2:32 PM  */ 
namespace App\Http\Controllers; use Illuminate\Routing\Controller; 
class pageController extends Controller {     
public function getIndex(){         
return 'Action Index';    
}     
public function getLienhe(){         
return 'Action Liên Hệ';     
}     
public function getThongtin(){         
return 'Action Thông Tin';     
} 
}

 Bây giờ bạn mở file app/routes.php bạn thêm:

Route::controller('/page','pageController',['getIndex'=>'index','getLienhe'=>'lienhe','getThongtin'=>'thongtin']);

Kết quả các bạn xem với 3 đường dẫn uRL

http://localhost/laravel-master/page/index

http://localhost/laravel-master/page/lienhe

http://localhost/laravel-master/page/thongtin

Làm việc với Controller

Tổng quát

Controller có chức năng: Sau khi route nhận được request thì sẽ chuyển hướng request đến cho controller và giao cho controller này xử lý.  Controller sẽgọi tới Model để tương tác với cơ sở dữ liệu (database) và  đưa dữ liệu tới View và View sẽ nhận dữ liệu và chuyển thành những đoạn mã HTML rồi gửi về cho Client.

Tất cả controller trong laravel được chứa trong thư mục app/controllers và việc tạo tên file, đặt tên controller cũng phải tuân theo nguyên tắc của nó như sau:

·         Lớp tạo ra phải kế thừa lớp Controller

·         Tên Controller phải trùng với tên File. Ví dụ bạn tạo Controller tên PageController thì file phải tên là PageController.php

Ngoài ra chúng ta cũng có thể tạo Controller nằm trong một subfolder.  Ví dụ bạn tạo thư mục con backend trong thư mục app/controllers và tạo một controller AdminController trong thư mục này và đặt tên controller tuân theo quy tắc trên là được. Nhưng để laravel có thể hiểu hiểu được AdminController này thì ngay sau khi tạo controller bạn phải chạy lệnh sau (run command): php artisan dump-autoload

Xây dựng các action trong Controller

Các vấn đề cần lưu ý:

Khi làm việc với Route::controller thì bạn chú ý việc đặt tên action phải tuân theo quy tắc methodUri như sau:

·         method là post, get, ... và viết thường

·         Uri: Chữ cái đầu tiên của Uri sẽ bắt buộc viết in hoa, cứ 1 chữ in hoa sẽ được tính là 1 đoạn uri được phân cách bởi dấu -

Ví dụ: action getDemoAction sẽ có method là get và Uri là demo-action

Cách truyền tham số vào cho action

Chúng ta sửa action của getLienHe trong PageController

public function getLienhe($id){
    dd($id);
}

Truy cập vào đường dẫn

http://localhost/laravel-master/page/lienhe/3

Đây là trường hợp đối với routes Controller. Các trường hợp các bạn chèn vào dấu {}

Ví dụ:

Route::get('/test-{id}', "testController@test");

Làm việc với View

View, một thành phần khá quan trọng trong mô hình MVC. Nhiệm vụ của View là nhận dữ liệu từ Controller  và sau đó dựa vào layout của giao diện nó sẽ xử lý dữ liệu theo yêu cầu.

Cách tạo View:

Trong laravel, mặc định tất cả các file view sẽ được lưu trong thư mục app/views với đuôi file là .php hoặc .blade.php nếu bạn sử dụng blade-template (khuyên dùng), việc tạo thì 2 loại file này tương tự nhau, bạn chỉ việc tạo file mới trong thư mục app/views là được. Nội dung trong file view thì có thể là bất cứ gì như code javascript, jquery, html, css, php.

Tạo Sub View

Để tạo sub-view trong laravel rất đơn giản, bạn chỉ việc tạo thư mục con và tạo file view trong đó. Ví dụ: trong views mình sẽ tạo thư mục page và trong page có 3 view là index, lienhe, thongtin

Cách gọi view

Cú pháp:

View::make($view, $data = array(), $mergeData = array());

Ý nghĩa:

·         $view là tên view mà bạn đã tạo

·         $data là mảng dữ liệu bạn truyền cho view thao tác để hiển thị

·         $mergeData là mảng dữ liệu sẽ được merge với $data bằng hàm array_merge

·         $view là bắt buộc, còn 2 tham số còn lại là tùy chọn

Nếu bạn muốn gọi sub-view thì sử dụng dấu chấm . để biểu thị cho 1 cấp thư mục. Ví dụ: view:make(‘page.lienhe’);

Ví dụ:

Trong Routes chúng ta tạo một Router sau:

Route::controller('/views','ViewController');

Tạo ViewController trong thư mục Controller

<?php
/**
 * Created by PhpStorm.
 * User: hphai
 * Date: 3/1/2016
 * Time: 4:22 PM
 */

namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
class ViewController extends Controller
{
}

Trong thư mục Resource Views tạo tập tin view01.php với nội dung bất kỳ.

Cập nhật lại ViewController

public function getReturn(){
    return View::Make('view01');
}

Truy cập http://localhost/laravel-master/views/return

Như vậy sử dụng các thành phần Routes, View và Controller của Lavavel khá đơn giản. Nhưng quan trọng chúng ta cần phải biết ứng dụng chúng trong các trường hợp sử dụng của một website như thế nào. Trong các bài viết sau chúng tôi sẽ hướng dẫn vấn đề này.

CLB Tin Học

  • Chưa có lời bình cho bài viết này.