Friday, February 27, 2015

Hướng dẫn tạo View Composer đơn giản với Laravel 5

Bạn có 1 menu hay một box nào đó hiển thị ở nhiều trang khác nhau. Để tránh lặp code và code template tường minh hơn , chúng ta có thể dùng View Composer của Laravel để giải quyết vấn đề này.

Sau đây là hướng dẫn tạo 1 View Composer đơn giản với Laravel 5

1. Tạo View Composer
- Laravel không có sẵn folder ViewComposer --> Bạn có thể tự tạo: App\Http\ViewComposers
- Tạo class MyTestComposer với nội dung bên dưới
- Code nghiệp vụ trong hàm composer và truyền tham số ra template. Ví dụ: Truyền biến $testVariable ra template như bên dưới.
<?php  //file: MyTestComposer.php
namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;

class MyTestComposer {
//    protected $param;

  /**
   * Create a new  composer.
   * @return void
   */
  public function __construct() {
    // Dependencies automatically resolved by service container...
  }

  /**
   * Bind data to the view.
   *
   * @param  View  $view
   * @return void
   */
  public function compose(View $view) {
    // Code here
    $view->with('testVariable', 'Value from MyTest Composer');
  }
}
2. Tạo template để xử lý dữ liệu mà ViewComposer đẩy ra
Ở đây tôi tạo template theo đường dẫn sau: (tùy thuộc vào cách quy hoạch project của các bạn)  resources/view/frontend/default/myComposer.blade.php
Nội dung template, ví dụ:
MyComposer Content <br />
{{ $testVariable }}  -- Hien thi gia tri bien $testVariable
3. Định nghĩa  ComposerServiceProvider
- Bạn cần tìm hiểu thêm về Provider:  http://laravel.com/docs/5.0/providers
- Tạo class ComposerServiceProvider trong thư mục app/Providers với nội dung sau:
- Đoạn code bôi đậm chính là khai báo việc template nào sẽ sử dụng ViewComposer của bạn? Ở đây là template layout chung của website. Bạn cũng có thể nhúng nó vào bất kỳ template nào tùy vào nghiệp vụ của hệ thống (home, news detail, etc ... )
Ví dụ:
View::composer(['frontend.home', 'frontend.newsDetail'], 'App\Http\ViewComposers\MyTestComposer');
<?php  // file: ComposerServiceProvider.php
namespace App\Providers;

use View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider {

  /**
   * Register bindings in the container.
   *
   * @return void
   */
  public function boot() {
    // Using class based composers...
    View::composer('frontend.layout', 'App\Http\ViewComposers\MyTestComposer');

    // Using Closure based composers...
//        View::composer('frontend.layout', function()
//        {
//          $menu = 'A|B|C';
//          $view->with('menus', $menus);
//        });
  }

  /**
   * Register
   *
   * @return void
   */
  public function register() {
    //
  }
}
4.Sau khi định nghĩa ComposerServiceProvider bạn cần khai báo vào mảng providers để hệ thống thực thi.
Sửa file: config/app.php
Thêm đoạn code bôi đậm vào mảng providers. (Tôi rút gọn các đoạn code mặc định)
'providers' => [
        /*
         * Laravel Framework Service Providers...
         */
        ...... Default Providers

        /*
         * Application Service Providers...
         */
        ...... Default Providers

        'App\Providers\ComposerServiceProvider'
    ],
5. Include template
Ở trên tôi khai báo template layout sẽ dùng MyTestComposer. Nghĩa là các tham số tương ứng của MyTestComposer cũng sẽ được truyền ra view tương ứng.
Việc cuối cùng cần làm là include template xử lý các tham số của MyTestComposer này
Mở file: resources/views/frontend/layout.blade.php include như sau
@include('frontend.default.myComposer')
6. Done.
Chúc các bạn có những dòng code đẹp và tường minh với Laravel :)
Refer:
- http://laravel.com/docs/5.0/views
- http://laravel.com/docs/5.0/providers
- http://laravel.com/docs/5.0/templates
- http://heera.it/laravel-4-view-composer-master-layout#.VPENkIusV1k

Laravel55555.

Sunday, February 1, 2015

Return Json và Download file với HTTP Responses


Việc xử lý code download file hay trả về json sẽ rất nhanh gọn

Creating A JSON Response
(Tự động set Content-Type header = "application/json"

return response()->json(['name' => 'Steve', 'state' => 'CA']);
Creating A JSONP Response
return response()->json(['name' => 'Steve', 'state' => 'CA'])
                 ->setCallback($request->input('callback'));
Creating A File Download Response
return response()->download($pathToFile);

return response()->download($pathToFile, $name, $headers);

Một số hàm xử lý HTTP request

Tương tự các framework khác, bạn có thể lấy giá trị từng biến, set default, hoặc lấy 1 mảng các giá trị truyền lên.
Một số hàm sau rất hữu ích trong 1 số trường hợp đặc biệt

Chỉ lấy một số input nhất định: 
$input = Request::only('username', 'password');

$input = Request::except('credit_card');
Hàm làm việc với 1 mảng các inputs: sử dụng dấu chấm "."
$input = Request::input('products.0.name');
Old input: Giữ lại input cho tới request tiếp theo (giống FLASH của symfony)
Ví dụ: 
Request::flashOnly('username', 'email');

Request::flashExcept('password');
Flash & Redirect 
return redirect('form')->withInput();

return redirect('form')->withInput(Request::except('password'));
Lấy giá trị old input từ flash 
$username = Request::old('username');
Get URI & URL
$uri = Request::path();
$url = Request::url();
Kểm tra đường dẫn Matches với 1 Pattern
if (Request::is('admin/*'))
{
    //
}
Source: http://laravel.com/docs/master/requests