hỏi làm blog bằng laravel
Bạn có thể tham khảo qua repo này https://github.com/jcc/blog. Blog của mình hiện tại cũng dựng base trên source code trên
Làm thế nào để Git Hub tự động chuyển branch ở PR
Cái này liên quan đến gitflow làm việc của từng dự án chứ không liên quan đến github action gì như bạn bên dưới nói.
- Mình cũng hơi thắc mắc sao bạn lại phải merge dev-2 vào dev-1 sau đó merge dev-1 vào dev. Mình có thể merge dev-2 thẳng vào dev, dev-1 thẳng vào dev. Coi dev là 1 target branch mà nhỉ 😅
Tối ưu multi update trong laravel.
Model::whereIn('id', $ids)->update(['diem_thi_ki2'=>$diem_thi_ki2]);
Bạn thử dùng whereIn
kết hợp với hàm update
xem sao 🤔
Link document: https://laravel.com/docs/10.x/collections#method-wherein
Bắt sự kiên đã có của class khi thêm 1 thẻ div mới bằng jquery
Bạn tìm hiểu từ khóa jquery event dynamic element
nha. Trường hợp của bạn thử dùng đoạn code mẫu như sau xem sao.
$(document).on('click', '.ex', function() {
console.log("Click event")
});
Tăng hiệu năng khi truy vấn sql trong laravel
The number of values in the IN list is only limited by the max_allowed_packet value.
Mình nghĩ đoạn này bạn có thể có 2 cách giải quyết
- Sử dụng hàm chunk trong Laravel để giới hạn bản ghi cần
- Còn một cách thủ công nữa bạn có thể thử là set cái max_allowed_packet tăng size nó lên (https://stackoverflow.com/questions/8062496/how-to-change-max-allowed-packet-size)
Làm sao để ngăn người dùng nhấn submit form nhiều lần ?
Thực ra cái này phụ thuộc vào người dùng submit form nhiều lần vô tình
hay cố tình
. Và việc họ click nhiều lần hay không bản chất vẫn là việc gửi - nhận dữ liệu giữa client và server thông qua giao thức HTTP
. Bạn có thể hạn chế người dùng bằng cách disable
các button, nhưng còn việc họ dùng tool cố tình call các đầu api để insert nhiều dữ liệu vào database của mình thì sao
Với user vô tình submit form thì bạn có thể sử dụng cách như bạn đã nói ở đầu bài, với một người non-tech thì họ cũng không có nhiều kiến thức để có thể sửa các element hay F12 chỉnh sửa các attribute. Nên mình nghĩ cách bên dưới là hợp lí.
Dùng javascript disable button, form ... cách này không ổn vì nó chỉ giải quyết phía client sẽ ko triệt để được
Với user cố tình phá hoại hệ thống thì họ có rất nhiều cách để insert nhiều bản ghi vào trong hệ thống của mình nếu như bạn không validate và có những cơ chế limit request
hợp lí. Mình thấy có một số cách cơ bản sau bạn có thể tránh được việc này.
-
Validate
đầu vào chặt chẽ, ví dụ như bạn có một cái form register thông tin user, đảm bảo rằng ở tầng application(cụ thể là Laravel sử dụng form request để validate thông tin email là unique). Ngoài ra bạn còn có thể validate input thông qua việclooking row
, hay là đánh các trường trong database làunique
để đảm bảo việc dữ liệu không bịduplicate
trong một số trường hợp. -
Limit request
gửi lên server. Ví dụ như 1 phút với một phiên đăng nhập của người dùng chỉ được phép request tối đa 60 request chẳng hạn.Ưu điểm là setting rất dễ, cả ở tầng server và application, ví dụ như Laravel đã config sẵn cho chúng ta trong
app/Http/Kernel.php
Nhược điểm là họ có thể
fake IP
để loại bỏ việc limit request.
'api' => [
'throttle:60,1',
'bindings',
],
-
Sử dụng
capcha
, đối với mỗi form request màhay bị tấn công
, hãy sử dụng capcha để đảm bảo rằng kẻ phá hoại không thể cùng lúc tiến hành call nhiều request lên server.Ưu điểm của phương pháp này là có thể giải quyết được bài toán fake IP phía trên
Nhược điểm là đem lại phiền toán cho người dùng bình thường, nhập
capcha everywhere
. Và việc triển khai cũng mất nhiều thời gian -
Sử dụng một số
tool monitoring
hệ thống, kịp thời phát hiện ra các IP khả nghi, phá hoại hệ thống để block hoặc đưa ra các phương pháp hạn chế người dùng hợp lí
Ngoài ra còn rất nhiều phương pháp nữa nhưng hi vọng các gợi ý trên đây có thể giúp đỡ được bạn
Cách viết câu truy vấn trong trường hợp này!
$salary = Salary::with('user.possition')->get();
Không cần thể hiện relation giữa Salary và Possition cũng được mà nhỉ
Validation input array laravel
Bác thử thay lại các select xem sao
<select name="question[{{ $id }}]">
Xử lý dữ liệu trong ajax
Bạn tìm hiểu thêm từ khóa jquery event dynamic element
xem sao nhé, trường hợp của bạn thử sửa như sau xem có giải quyết được bài toán của bạn không
<script type="text/javascript">
$(document).on('click', '#fTangDiem', function() {
$("#btnTangDiem", this)
.html("Đang xử lý...")
.attr("disabled", "disabled");
return true;
});
</script>
Laravel API và setInterval AJAX
Em đoán do lần đầu $.ajaxSetup()
được gọi do khi load trang. Từ lần thứ 2 nó không bắt được event load trang nên không gọi vào hàm này nữa dẫn đến lỗi csrf token mismatch
Bác thử xử lí theo kiểu set cái token vào data khi call ajax xem sao
$.ajax({
url: "savechange",
method: "PUT",
data: {
id: 123332423,
"_token": $('meta[name="csrf-token"]').attr('content')
},
});
Công nghệ được sử dụng trong Viblo là gì các bác!
Đúng đó bạn ơi, trước mình xem một video anh Thắng có nói qua về cách viblo đang vận hành thì phải
Link: https://viblo.asia/p/viblo-deployment-day-web-development-best-practices-Eb85oJGWl2G
Tại sao từ Eloquent có thể call được function định nghĩa cho query builder?
This is because Eloquent usesIlluminate\Database\Query\Builder
behind the scenes and you can find all those methods in this Builder class.
When you run function that does not exist in Users model in this case, magic method __call(https://www.php.net/manual/en/language.oop5.overloading.php#object.call) is used:
public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement'])) {
return call_user_func_array([$this, $method], $parameters);
}
$query = $this->newQuery();
return call_user_func_array([$query, $method], $parameters);
}
as you see in this method newQuery method is executed. And when you look at this method definitions you can see here:
public function newQuery()
{
$builder = $this->newQueryWithoutScopes();
foreach ($this->getGlobalScopes() as $identifier => $scope) {
$builder->withGlobalScope($identifier, $scope);
}
return $builder;
}
and further, when you look at newQueryWithoutScopes you'll see there:
$builder = $this->newEloquentBuilder(
$this->newBaseQueryBuilder()
);
and this newEloquentBuilder
method returns new Builder($query);
so it's an Illuminate\Database\Query\Builder
object
Config APP_URL trong .env laravel không nhận @@????
Phần gửi gửi mail bạn có dùng queue không ? Nếu có thử restart queue chạy
php artisan queue:restart
Rồi gửi mail lại xem sao
Các pro Laravel cho em hỏi chút về Query Builder với ạ
Bạn có thể sử dụng một class như là repository. Ví dụ như thế này, đảm bảo không cần extend Models
namespace App\Repo;
use Illuminate\Database\Connection;
use Illuminate\Support\Collection;
class StreetRepository implements StreetRepositoryInterface
{
/**
* @var \Illuminate\Database\Connection
*/
protected $db;
/**
* StreetRepository constructor.
*
* @param \Illuminate\Database\Connection $db
*/
public function __construct(Connection $db)
{
$this->db = $db;
}
/**
* @return \Illuminate\Database\Query\Builder
*/
protected function query()
{
return $this->db->table('streets');
}
public function paginateList($page = null, array $columns = ['*'], $perPage = StreetRepositoryInterface::DEFAULT_LIMIT)
{
return $this->query()
->paginate($perPage, $columns, 'page', $page);
}
....
Sử dụng toast trong laravel
toastr.clear();
Sau mỗi lần thực thi toast.success
hoặc toast.info
bạn ơi
Xin hỏi về get value 0 từ form trong laravel
Trên server xử lí, nếu value có giá trị bằng [] thì gán lại cho nó bằng 0 là được mà bạn =))
Validation trong Laravel
- Tạo 1 rule để validate số tiền trong ví và trong DB
php artisan make:rule CheckMaxMoney
Trong class CheckMaxMoney ở thư mục app/rule
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class CheckMaxMoney implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
$money = Lấy dữ liệu money của người dùng trong DB;
if($value < $money) {
return true; // Pass validate
}
return false; // Không pass validate
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'Số tiền trong ví nhỏ hơn số tiền chuyển .';
}
}
- Tạo 1 form validate để khi có request chuyển tiền
php artisan make:request TransactionRequest
Trong class TransactionRequest xử lí
<?php
namespace App\Http\Requests\Form;
use Illuminate\Foundation\Http\FormRequest;
use App\Rule\CheckMaxMoney;
class TransactionRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'monney' => new CheckMaxMoney($this->money)
];
}
}
Có thể idea đến triển khai sẽ gặp vài lỗi nhưng tư tưởng là vậy. Chúc bạn may mắn, mà chắc bạn đang dùng laravel nhỉ :3
Tham khảo thêm : https://laravel.com/docs/7.x/validation#using-rule-objects
Tìm hiểu về queues và Task Scheduling
Vì câu hỏi của bạn chưa rõ ràng về cấu hình queue ra sao nên mình cứ trả lời theo cách mình vẫn hay làm vậy. Thường thì mọi người hay cấu hình lưu job ở database
hoặc redis
. Mình thì hay chọn redis
nên mình setup như nhau.
- Cài đặt redis
sudo apt-get update
sudo apt-get install redis-server
- Kiểm tra xem nó đã được cài đặt hay chưa ? Nếu output là PONG thì coi như cài đặt thành công
redis-cli
127.0.0.1:6379> ping
//Output
PONG
- Tiếp theo là cài đặt
predis
đểLaravel
thao tác vớiredis
composer require predis/predis
- Cấu hình .env trong
Laravel
QUEUE_DRIVER=redis
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_CLIENT=predis
- Chạy câu lệnh để lằng nghe các job trong queue ở một terminal và giữ nguyên chúng trong quá trình làm việc ở local.
php artisan queue:restart // Cẩn thận nên mình khởi động lại queue
php artisan queue:work redis
- Khi có 1 job được lắng nghe trên terminal sẽ hiển thị như sau. Trường này là job của mình đang bị fail
SUN-ASTERISK\nguyen.huu.su@b122087-pc:~/Framgia-project/manager_shirt$ php artisan queue:work redis
[2020-04-26 07:16:16][pufXwWA6lXRXesqc5yGrJVelYBRQtYr7] Processing: App\Jobs\ProcessGetDataSheet
[2020-04-26 07:18:37][pufXwWA6lXRXesqc5yGrJVelYBRQtYr7] Failed: App\Jobs\ProcessGetDataSheet
- Khi queue lỗi thì theo config mặc định của file config/queue.php sẽ lưu vào bảng
fail_jobs
như sau
'failed' => [
'driver' => env('QUEUE_FAILED_DRIVER', 'database'),
'database' => env('DB_CONNECTION', 'mysql'),
'table' => 'failed_jobs',
],
Chúc bạn may mắn
PHP- tăng thời gian đợi khi load website
Bonus nếu bạn dùng Laravel bạn có thể khai báo luôn ở constructor của class
public function __construct()
{
set_time_limit(8000000);
}