Pages

Showing posts with label Laravel. Show all posts
Showing posts with label Laravel. Show all posts

Sunday, February 18, 2018

Di chuyển controller trong Laravel sang sub-folder.

Mặc định thư mục controller của Laravel nằm trong thư mục: app\Http\Controllers.

Trong thư mục này, Laravel thiết kế sẵn một file Controller mặc định và một controller có tên HomeController dùng để điều khiển việc login/đăng ký. Tất cả các controller thiết kế đều extends Controller này.

Noted: cái controller mặc định không có S ở tên, nhưng nó nằm trong thư mục Controllers có S.

app\Http\Controllers\Controller

Khi số lượng Controller tăng lên, ta có nhu cầu chuyển Controller vào các thư mục hoặc tiểu thư mục (sub-folder). Ví dụ ta có sub-folder cho front-end và một sub-folder cho back-end.

Khi ta chuyển các controller sang các sub-folder trong thư mục Controllers thì đương nhiên, một số việc cần phải làm.

1) namespace mặc định, từ: namespace App\Http\Controllers;

sẽ thành: namespace App\Http\Controllers\frontend;

2) vì ta viết controller mới trong thư mục mới, nên ta phải triệu gọi Controller mặc định bằng lệnh: use App\Http\Controllers\Controller;

nếu không, ta không thể extends được.

3) Do đổi vị trí của controller nên đương nhiên route cũng phải đổi.

Từ Route::get('/', 'PhotoController@index')->name('photo.index');

Đổi thành Route::get('/', 'frontend\PhotoController@index')->name('photo.index');

Ta còn có cách nữa khi chỉnh sửa Route là dùng namespace. Ta cần đưa vào group như sau:

Route::group(['prefix' => 'admin', 'as' => 'admin.', 'namespace' => 'backend'], function(){

// các route

Saturday, February 17, 2018

về rand() trong mysql và sự hầm hố của Laravel

Mình cần thiết lập truy vấn lấy ngẫu nhiên dữ liệu trong bảng mysql. Câu truy vấn thuần như sau:

 SELECT */column FROM table ORDER BY RAND()  LIMIT 1

Trong câu trên, truy vấn sẽ lấy toàn bộ dữ liệu (nếu dùng *), hoặc lấy từ cột có tên "column", trong bảng có tên "table", sắp xếp theo ngẫu nhiên rand(), giới hạn lấy dữ liệu ra là 1. Các thông số này có thể tùy chỉnh, it means optional/subjective choice.

Giờ thử qua Laravel. Thằng Framework này khá lỏng lẻo/linh hoạt, aka unrestricted/flexible trong việc khai báo và sử dụng truy vấn dữ liệu. Ba cách của Laravel là:


Cách 1: Thử random bằng Eloquent
       
$data['anh'] = Picture::inRandomOrder()->take(100)->get();


Giả sử trong Controller của mình mình tạo một biến $data có chứa key của array sẽ được truyền vào view là "anh", mình dùng truy vấn của Eloquent bằng cách khai báo dùng model có tên Picture. Model này tương ứng với việc truy cập bảng "pictures" (khai trong Model trên). Phương thức sau dấu :: là inRandomOrder() và lấy take(100) rồi dùng get(); để lấy ra. Sau đó qua View, vì dữ liệu xuất của Eloquent là Collection nên mình chỉ cần dùng foreach đổ dữ liệu ra là xong.

Tuy nhiên, nghe nói cách này chậm.

Cách 2: Giờ tới cách này, cũng là Eloquent

$data['anh'] = Picture::latest('id')->take(20)->get();

Mình vẫn dùng Model có tên Picture và dùng lastest để xuất ra các record mới nhất. Mình thử đặt tham số trong hàm latest và KHÔNG ĐẶT tham số thì thấy đều okey.

Cách 3: Nghe nói Query Builder nhanh hơn.

        $data['anh'] = DB::table('pictures')
                 ->inRandomOrder()
                 ->take(15)
                 ->get();

Mình dùng lớp DB tạo sẵn và truy vấn trong bảng 'pictures',  dùng hàm inRandomOrder để lấy ngẫu nhiên, take() lấy số lượng, dùng get() để đổ ra.

Noted là: 3 cách trên đều okey.

Laravel có 4 cách truy vấn dữ liệu: thuần, thuần kiểu Laravel (dùng facade/db), Query Builder và Eloquent.

Nên dùng Query Builder hoặc Eloquent.


 Tham khảo thêm tại: https://stackoverflow.com/questions/40777417/take-10-random-rows-from-the-top-100


Wednesday, November 22, 2017

[1] LARAVEL Routing

Mình sẽ tóm lược tài liệu chính thức của Laravel, từ 23/11/2017

Basic Routing

Dưới đây là một ROUTE cơ bản, hàm Closure (hàm không có tên, có thể gán cho 1 biến $variable)cung cấp phương thức cơ bản định danh route này.
Route::get('foo', function () {
    return 'Hello World';
});

Sunday, November 19, 2017

Laravel: Truyền dữ liệu từ Route -->Controller --> View và dùng chung dữ liệu trên View

Trong bài viết này, giả sử chúng ta có view welcome.blade.php như sau
<!DOCTYPE html>
<html>
<head>
 <title></title>
</head>
<body>
 <h1>Hello, {{ $name }}</h1>
</body>
</html>
Như vậy để truyền dữ liệu ra View (Passing Data To Views) chúng ta có các cách như sau đây để trên view welcome.blade.php có thể sử dụng được được biến $name

Cách 1: Truyền vào 1 mảng

return view('welcome', [
  'name' => 'Chung Nguyễn'
 ]);
Nếu cần truyền thêm dữ liệu thì thêm vào mảng trên bây nhiêu thôi.

Cách 2: Sử dụng with method

return view('welcome')->with('name', 'Chung Nguyễn');
Với việc dùng view helper function, chúng ta hoàn toàn có thể pass data to views 1 cách dễ dàng thông qua phương thức with, cũng giống như ở trên nhưng code chúng ta sẽ trở nên sáng sủa, dễ nhìn hơn phải k nào

Cách 3: Lồng compact

$name = 'Chung Nguyễn';
return view('welcome', compact('name'));
Cách này trong Laravel document không có nhắc tới, mình hay dùng cách này vì số lần gõ phím là ít nhất hehe
Nếu muốn truyền thêm nhiều dữ liệu hơn thì thêm như dưới đây
$name = 'Chung Nguyễn';
$age = 25;
return view('welcome', compact('name', 'age'));

Cách 4: Chia sẻ dữ liệu cho toàn bộ Views

Laravel cung cấp phương thức share chia sẻ dữ liệu cho toàn bộ Views (Sharing Data With All Views) hay nói cách khác là biến toàn cục.
Thông thường, bạn nên đặt share trong method boot của service provider chẳng hạn app/Providers/AppServiceProvider.php hoặc trong __construct function của Controller
<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('name', 'Chung Nguyễn'); // <= Truyền dữ liệu
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

(credit: lượm lặt từ: https://chungnguyen.xyz/posts/truyen-du-lieu-ra-view-trong-laravel)

Ở cách 4 thì dùng view::share tiện hơn rất nhiều, và thấy là workable từ 5.4 trở lên.


1) Giả sử trong Route có

// sẽ gọi /myview trên trình duyệt, đây là request --> gọi tới route --> tới controller
Route::get('/myview', 'MyController@myview');

Route::get('/Time/{t}', 'MyController@Time');

// share giữa route, controller và view
View::share('khoahoc', 'Tiếng Việt');

2) Trong MyController có

 public function Time($t){

    return view('myview', ['time'=> $t]);

    }

3) Trong myview

<p>It is <?php echo $khoahoc;?></p>


Kết quả trên /Time/thamso của trình duyệt khi request vẫn ra

Đây là nội dung từ Controller:44
Đây là nội dung từ Route Tiếng Việt



Tham khảo:

https://laravel.com/docs/5.5/views


Saturday, November 18, 2017

Vòng tuần hoàn của Laravel


vòng tuần hoàn của Laravel: 

REQUEST => SERVICES => ROUTING => LOGIC => RESPONSE


source: https://www.tutorialsplane.com/laravel-request-lifecycle-process/

Saturday, October 28, 2017

Cài nhanh Laravel lên VPS dùng Vestacp

Vesta dùng với Centos cài sẽ ra thư mục home/username/web/domain. Các biến nằm ở $username và $domain, tùy vào tài khoản và tùy vào domain.

Trong mỗi domain sẽ có thư mục public_html.

Giờ cài Larvel bằng composer đơn giản.

1. cài composer

curl -k -sS https://getcomposer.org/installer | php

để kiểm tra thành công chưa bạn chạy lệnh sau:composer -V

2. Vào thư mục của domain cần cài đặt trên terminal.

Phương án 1: Cài Laravel 5.4 với thư mục blog trong thư mục ngang hàng thư mục public_html: composer create-project --prefer-dist laravel/laravel blog "5.4.*"

Phương án 2: Cài qua git

sudo yum install git git clone your/project

sau đó cd vào thư mục code của bạn chạy lệnh sau:cd /var/www/yoursite composer install

3. Đổi tên thư mục public_html thành thư mục bất kì, đổi tên thư mục blog thành thư mục public_html.

4. Thiết lập thư mục storage thành 777

5.Nhét đoạn .htaccess sau vào thư mục cài đặt để truy cập trên web vào root thay vì public

(PS: Đưa hai thẻ as if html vào)

IfModule mod_rewrite.c

RewriteEngine On

RewriteRule ^$ public/index.php [L]

#RewriteRule ^((?!public/).*)$ public/$1 [L,NC]

IfModule

Tận hưởng, xem thêm tại:

https://viblo.asia/p/cai-dat-laravel-framework-tren-centos-vps-mrDkMMjPkzL

https://laravel.com/docs/5.4/installation

Updated: Tùy chỉnh trong virtualhost (với Apache) thay vì .htaccess để vào trực tiếp thư mục public của LR.