/ / Laravel Framework / Comments (2)

Laravel Framework: Tìm hiểu về Controller

Kết thúc bài trước trong chuyên mục Laravel Framework mình đã giới thiệu cho các bạn về khái niệm cũng như cách sử dụng Route trong Laravel,Route là 1 phần rất quan trọng trong Laravel lên các bạn cần nắm vững về phần này nhé.Trong bài hôm này mình sẽ giới thiệu cho các bạn về Controller trong Laravel và cũng sẽ đụng tới cả phần Route của bài học trước nữa.
– Như các bạn được biết trong Laravel cho phép chúng ta có thể xử lý dữ liệu ngay bên trong Route nhưng đối với những thao tác phức tạp vài dài chúng ta lên xử lý trong Controller.Có như vậy thì ứng dụng của bạn mới trở nên linh hoạt và dễ mở rộng sau này,chả lẽ tất cả code viết trong file Route sẽ khó mà quản lý phải không nào.Chúng ta sẽ dần tìm hiểu về cách khai báo cũng như sử dụng Controller nhé.

Tìm hiểu về Controller trong Laravel

Khai báo 1 controller trong Laravel

– Để tạo 1 controller các bạn cần vào thư mục app/controller với các quy tắc sau:

  1. Tên file trùng với tên Class
  2. Kế thừa từ lớp BaseController

Ví dụ:
Tạo 1 file HocphpController.php với nội dung:

<?php
class HocphpController extends BaseController {
	public function test(){
	    echo 'Tim hieu ve Controller trong Laravel tai Hocphp.info';
	}
}

– Để cấu hình chạy được Controller thì ta có khá nhiều cách,mình sẽ giới thiệu cho các bạn các cách sau,tùy vào từng trường hợp và sở thích các bạn có thể sử dụng các cách khác nhau nhé.Và các cách này thì các bạn đều phải cấu hình trong file Route

Cấu hình để chạy controller

1. Chạy controller theo phương thức Route::get

– Trước tiên các bạn truy cập vào file routes.php thêm nội dung sau:

Route::get('/controller-test', 'HocphpController@test');

Với đoạn code cấu hình trên ta đã khai báo 1 link controller-test sẽ gọi tới controller HocphpController và phương thức(action) là test.Như vậy khi các chạy link localhost/laravel/public/controller-test sẽ hiển thị nội dung như ý muốn.

Tim hieu ve Controller trong Laravel tai Hocphp.info

– Chúng ta sẽ đi thêm vào 1 ví dụ nữa về việc truyền tham số vào controller thế nào nhé.
Trong HocphpController tạo phương thức sau:

<?php
class HocphpController extends BaseController {
	public function view($title, $id)
	{
	    echo 'Bạn đang xem bài viết '.$title.' có ID là :'.$id;
	}
}

Và file routes.php ta cấu hình như sau:

Route::get('/bai-viet-{title}/{id}', 'HocphpController@view');

Và khi các bạn chạy link localhost/laravel/public/bai-viet-hocphp/1 sẽ nhận được kết quả:

Bạn đang xem bài viết hocphp có ID là :1

,
Như vậy các bạn thấy chúng ta đã gửi thành công 2 biến đó chính là $title = hocphp$id = 1.

2. Implicit Controllers – Sử dụng phương thức Route::controller

– Như các bạn thấy trong 1 controller chúng ta thường có khá nhiều các phương thức(action) phải không nào,như vậy chả lẽ mỗi lần muốn chạy 1 action nào đó lại phải vào file routes.php để thêm cấu hình sao?như vậy cũng thật bất tiện và khó quản lý phải không nào.Trong Larvel còn cho phép chúng ta có thể chạy các phương thức trong controller 1 cách tự động dựa vào tên action đó.
+ Trước tiên các bạn vào file routes.php thêm đoạn code cấu hình như sau:

Route::controller('hocphp', 'HocphpController');

Với phương thức Route::controller cho phép chúng ta sử dụng 2 đối số,đối só thứ nhất chính là định dạnh URI,đối số thứ 2 chính là tên lớp controller.Trong ví dụ trên mình đã định nghĩa 1 URI có tên hocphp đại diện cho lớp controller HocphpController.
+ Tiếp theo chúng ta cần chỉnh sửa nội dung file controller như sau:

<?php
class HocphpController extends BaseController {
	public function getTest(){
	    echo 'Tim hieu ve Controller trong Laravel tai Hocphp.info';
	}
}

Như các bạn thấy nếu chúng ta cấu hình theo phương thức Route::controller trong routes thì trong controller chúng ta cũng phải viết đúng theo các quy tắc trong Laravel như sau:

  1. Trước các action phải có các tiền tố là các giá trị get,post,any…các giá trị này các bạn có thể xem lại trong bài viết về Route và tên action phải viết hoa chữ cái đầu
  2. Tên phương thức phân biệt chữ hoa và chứ thường
  3. Khi muốn chạy action thì chạy theo dạng link URI/tên action viết thường

Và lúc này chúng ta muốn chạy action test thì sẽ chạy đường link sau:

localhost/laravel/public/hocphp/test

Các bạn thấy là trong Laravel phân biệt chữ hoa và chữ thường lên các bạn cần chú ý nhé,và dưới đây là sẽ link không hợp lệ

localhost/laravel/public/hocphp/Test

– 1 Chú ý nữa trong việc chạy các action trong controller đó là nếu tên của action mà có nhiều chữ viết hoa thì khi chạy các bạn cần thêm dấu ‘-‘ đằng trước chữ viết hoa và chuyển chữ viết hoa về chữ thường nhé,ví dụ:

<?php
class HocphpController extends BaseController {
	public function getHocphpTest(){
	    echo 'Tim hieu ve Controller trong Laravel tai Hocphp.info';
	}
}

Thì link chạy đúng sẽ là:

http://localhost/laravel/public/hocphp/hocphp-test

Như vậy là chữ Test viết hoa chữ cái đầu tiên (T) lên mình phải thêm ký tự '-' đằng trước và chuyển chữ T -> t,và nếu các bạn chạy link sau sẽ không hợp lệ:

http://localhost/laravel/public/hocphp/hocphptest

Hoặc

http://localhost/laravel/public/hocphp/hocphpTest

– Còn đối với việc mà chúng ta muốn gửi giá trị vào controller chúng ta sẽ gửi theo dạng các phân đoạn trên URL,ví dụ:

<?php
class HocphpController extends BaseController {
	public function view($title, $id)
	{
	    echo 'Bạn đang xem bài viết '.$title.' có ID là :'.$id;
	}
}

Và khi các bạn chạy đường link

http://localhost/laravel/public/hocphp/view/hocphp/1

Và kết quả sẽ hiển thị

Bạn đang xem bài viết hocphp có ID là :1

3. RESTful Resource Controllers – Sử dụng phương thức Route::resource

– Để lập một controller qua câu lệnh command line, thì ta thực hiện:

php artisan controller:make HocphpController

– Bây giờ bạn có thể đăng lý một resourceful route tới controller

Route::resource('hocphp', 'HocphpController');

Việc lập route đơn này sẽ xử lý nhiều route của RESTful actions trên nguồn hocphp.
Dưới đây là bảng ánh xạ giữa route và action

Actions Handled By Resource Controller

Actions Handled By Resource Controller

Và dưới đây là 1 ví dụ đơn giản trong controller HocphpController

<?php
class HocphpController extends BaseController {

	/**
	 * Hocphp Repository
	 *
	 * @var Hocphp
	 */
	protected $Hocphp;

	/**
	 * Display a listing of the resource.
	 *
	 * @return Response
	 */
	public function index()
	{

	}

	/**
	 * Show the form for creating a new resource.
	 *
	 * @return Response
	 */
	public function create()
	{

	}

	/**
	 * Store a newly created resource in storage.
	 *
	 * @return Response
	 */
	public function store()
	{

	}

	/**
	 * Display the specified resource.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function show($id)
	{

	}

	/**
	 * Show the form for editing the specified resource.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function edit($id)
	{

	}

	/**
	 * Update the specified resource in storage.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function update($id)
	{

	}

	/**
	 * Remove the specified resource from storage.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function destroy($id)
	{       

	}

}

– Như vậy những việc quản lý dữ liệu(hiển thị ,thêm, sửa, xóa) các bạn có thể viết tại controller này
Ngoài ra thì bạn có thể giới hạn được những action nào được thực thi

Route::resource('hocphp', 'HocphpController',
                array('only' => array('index', 'show')));

Route::resource('hocphp', 'HocphpController',
                array('except' => array('create', 'store', 'update', 'destroy')));

Controllers với filters

– Trong bài viết về Route mình đã giới thiệu về filters trong Laravel.Đây chính là phần bộ lọc định tuyến,nó cho phép chúng ta có thể kiểm tra trước khi truy cập vào đường dẫn đó.Như vậy các bạn hoàn toàn có thể sử dụng filters để lọc dữ liệu với Controller.Bạn có thể khai báo trên file route như sau:

Route::get('add', array('before' => 'auth',
            'uses' => 'HocphpController@store'));

– Ngoài ra các bạn còn có thể sử dụng filters ngay tại trong Controller,ví dụ:

<?php
class HocphpController extends BaseController {
	public function __construct()
	{
		$this->beforeFilter('auth', array('except' => 'getLogin'));
		$this->beforeFilter('csrf', array('on' => 'post'));
	}
}

– Bạn cũng có thể chỉnh định cho filter bằng cách sử dụng Closure:

<?php
class HocphpController extends BaseController {
    /**
     * Instantiate a new UserController instance.
     */
    public function __construct()
    {
        $this->beforeFilter(function()
        {
            //code here
        });
    }
}

– Nếu bạn muốn sử dụng một phương thức khác làm filter thì ban có thể thêm @ để định nghĩa filter

<?php
class HocphpController extends BaseController {
	public function __construct()
	{
		$this->beforeFilter('@filterRequests');;
	}

	public function filterRequests($route, $request){
	    //code here
	}
}

+ Như vậy các bạn thấy việc sử dụng Filter cho Controller có rất nhiều cách phải không nào.
Kết thúc bài viết: Qua bài này mình đã giới thiệu cho các bạn cái nhìn tổng quan về Controller trong Laravel,Sang bài tiếp theo mình sẽ đề cập tới việc kết nối cơ sở dữ liệu trong Laravel



25/09/2014
Written by nobitacnt

Trong bài viết không tránh khỏi những câu từ chưa chính xác,mong nhận được sự góp ý để website hoàn thiện hơn.Nếu thấy bài viết có ích với bạn hãy like và share để ủng hộ nhé :D.

Bài viết chùng chuyên mục

2 Comments

  1. Phạm Văn Trường says:
     /  Reply

    cám ơn bài viết của bạn nhiều, bạn có thể viết bài về view trong laravel ko bạn !
    mình thấy @yield(‘content’)
    @section(‘content’) mà không hiểu gì cả ! Cảm ơn bạn nhiều

    • nobitacnt says:
       /  Reply

      Ok,chắc chủ nhật rảnh mình sẽ viết bài về view trong Laravel.

Gửi bình luận

Giới thiệu

Mình tạo ra blog này với mong muốn chia sẻ và học hỏi kinh nghiệm trong quá trình thiết kế website. Website đang trong quá trình phát triển chân thành cảm ơn mọi sự góp ý của các bạn để làm cho website ngày càng hoàn thiên.

DMCA.com Protection Status
Theo dõi qua Email

Tổng hợp các bài viết về

Hoc php - CodeIgniter Framework - Laravel Framework - PHP va MYSQL