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
}
Showing posts with label Laravel. Show all posts
Showing posts with label Laravel. Show all posts
Sunday, February 18, 2018
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
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';
});
Ở mục
Laravel
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 có
<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
Ở mục
Laravel
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.
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.
Ở mục
Laravel
Subscribe to:
Posts (Atom)