ICTsharing - Blog chia sẻ kiến thức về ICT: Laravel

Hot

Post Top Ad

Hiển thị các bài đăng có nhãn Laravel. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Laravel. Hiển thị tất cả bài đăng

Thứ Năm, 26 tháng 12, 2019

Chia Sẻ Khóa Học Laravel 6 Full - Xây Dựng Cổng Thông Tin Quản Lý Nhân Sự

14:33 0

Với laravel phiên bản 6 quá manh mẽ, khóa học này Xây dựng các cổng web cơ bản đến nâng cao bằng cách sử dụng Laravel 6, Bao gồm mã nguồn miễn phí hoàn toàn.

Bạn sẽ học được gì:
  • + Cách xây dựng website từ cơ bản đến nâng cao bằng cách sử dụng laravel 6.
  • + Khái niệm về kiến ​​trúc của Laravel 6.
  • + Laravel 6 Basic.
  • + Laravel 6 Frontend.
  • + Laravel 6 Security.
  • + Laravel 6 migration.
  • + Laravel 6 Database.
  • + Laravel 6 Eloquent ORM.
  • + Laravel 6 Testing.
Laravel 6 đi kèm với rất nhiều tính năng mạnh mẽ mới như:
  • 1. Lazy collections.
  • 2. Laravel Vapor compatibility.
  • 3. Job middleware.
Trong khóa học này, một chủ đề cho mỗi phần, sẽ giúp bạn tăng tốc nhanh chóng.

Laravel được xây dựng bởi Taylor Ortwell để đáp ứng tất cả các nhu cầu cơ bản của bất kỳ nhà phát triển web nào. Nếu bạn đang tìm kiếm một video hướng dẫn toàn diện về laravel 6 bao gồm tất cả các chủ đề cốt lõi của laravel 6 trong khi sử dụng laravel 6 để xây dựng một dự án đầy đủ, thì đây là khóa học bạn cần.

Khóa học toàn diện hướng dẫn dựa trên dự án laravel 6 này, sẽ đề cập đến tất cả các chủ đề quan trọng từ cơ bản đến nâng cao như:
  • + Authentication.
  • + Generation.
  • + Architecture Concepts.
  • + The Basics.
  • + Frontend.
  • + Security.
  • + Digging Deeper.
  • + Database.
  • + Eloquent ORM.
  • + Testing.


LINK DOWNLOAD 1

Xem thêm

Thứ Ba, 17 tháng 12, 2019

Laravel 6 có gì mới?

14:31 0
Ngày 3/9/2019 thì Laravel đã release phiên 6.0 và đây là phiên bản LTS tiếp theo (trước đó là Laravel 5.5). Vậy phiên bản này có gì mới?

Sử dụng version Semantic versioning thay vì Scheme

Với những dev thường xuyên làm hệ thống lớn sử dụng dependency rất hiểu mỗi khi cần nâng cấp. Khi hệ thống của bạn đang ngày càng lớn dần, các packages càng được sử dụng nhiều thì việc xung đột phiên bản là điều không thể tránh khỏi. Bảo trì và phát triển càng trở lên khó khăn hơn rất nhiều.
Đó là lý do phiên bản Laravel 6.0 sử dụng Semver phiên bản 2.0.0 đã đưa ra 11 quy tắc. Các bạn có thể tìm hiểu thêm tại đây

Job middleware

Thay vì thêm thủ công boilerplate code xung quanh jobs của bạn, bây giờ bạn có thể extract it into middleware và sau đó chỉ cần gắn nó vào job!

Ví dụ này cho thấy cách bạn có thể thêm rate limiting cho một job trước 6.0. Bạn sẽ thêm nó vào phương thức handle() của job cho mỗi job request nó.

// app/Jobs/JobToBeThrottled.php
// Execute the job
public function handle() {
  // allow one job to process every 5 seconds
  Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () {
    // Handle the job
  }, function () {
    // Could not obtain lock
    return $this->release(5);
  });
}

Với bản release mới này, chúng ta có thể extract code đó ra khỏi handle() và chuyển nó thành một middle dành riêng cho job-specific. Bạn có thể tạo một thư mục trong app/Jobs/Middleware (hoặc bất cứ nơi nào bạn muốn, Laravel không rằng buộc về việc này) và thêm một file cho middleware trong thư mục đó.


// app/Jobs/Middleware/RateLimited.php
...
namespace App\Jobs\Middleware;
use Illuminate\Support\Facades\Redis;

class RateLimited {
  // Process the queued job.
  public function handle($job, $next) {
    Redis::throttle('key')
      ->block(0)->allow(1)->every(5)
      ->then(function () use ($job, $next) {
        // Lock obtained
        $next($job);
      }, function () use ($job) {
        // Could not obtain lock
        $job->release(5);
      });
  }
}
Bây giờ bạn có thể đính kèm middleware này vào job và nó sẽ chạy qua phần mềm trung gian trước khi xử lý. Nếu bạn quen thuộc với route middleware, quá trình này rất tương tự.

// app/Jobs/JobToBeThrottled.php
use App\Jobs\Middleware\RateLimited;

// get the middleware that the job will use
public function middleware() {
  return [new RateLimited];
}

public function handle() {
  // handle the job
}
Điều này sẽ giữ cho các job file của bạn nhỏ, dễ đọc hơn và tập trung vào nhiệm vụ cụ thể của nó. Nó cũng sẽ cho phép bạn dễ dàng sử dụng lại middleware trong suốt các job.

Lazy collections

Laravel 6.0 giới thiệu về lazy collections, sẽ cho phép bạn giữ mức sử dụng bộ nhớ thấp khi xử lý dữ liệu nặng.

Nếu bạn đang làm việc với các Eloquent model, bạn có thể chọn tải một model vào bộ nhớ cùng lúc thay vì mọi thứ cùng một lúc bằng cách sử dụng phương thức cursor() thay vì all().


// This loads all eloquent models into memory at the same time
// This may be a very large number if you have thousands of posts

$posts = App\Post::all()->filter(function ($post) {
    return $post->id > 500;
});
Bằng cách chuyển từ all() sang cursor(), chỉ có một eloquent model được tải vào bộ nhớ tại một thời điểm vì cursor() sử dụng LazyCollection instance mới.

$posts = App\Post::cursor()->filter(function ($post) {
  return $post->id > 500;
});

foreach ($posts as $post) {
  echo $post->id;
}

Eloquent subquery enhancements

Eloquent luôn giúp việc chạy các truy vấn phức tạp trở nên dễ dàng hơn. Bản release mới này cung cấp cho bạn nhiều trợ giúp hơn khi chạy các subquery hoặc query trong một query, trong single call. Điều này hữu ích khi bạn cần chọn thông tin từ hai bảng có mối relationship. Trong Laravel 5.x đôi khi bạn bị giới hạn với những gì bạn có thể làm trong subquery và thường sẽ bị buộc phải xâu chuỗi truy vấn bằng cách sử dụng DB::raw().

Phương thức addSelect() đã được thêm vào các subquery, điều này sẽ giúp loại bỏ rất nhiều sự khó khăn! Các subquery giờ cũng sẽ có quyền truy cập vào orderBy.

Trong ví dụ này, hãy tưởng tượng bạn có 2 bảng: hotels reservations. Bạn muốn biết loại room gần đây nhất đã được đặt cho một khách sạn cụ thể. Thay vì thực hiện hai eloquent queries riêng biệt, giờ đây bạn có thể thực hiện việc này:

use App\Reservation;
use App\Hotel;

return Hotel::addSelect(['last_booked_room' => Reservation::select('room_type')
  ->whereColumn('hotel_id', 'hotels.id')
  ->orderBy('created_at', 'desc')
  ->latest()
  ->limit(1)  
])->get();

Improved custom authorization responses

Nếu bạn đang sử dụng authentication bên ngoài của Laravel với các fate cho authorization, thì Laravel 6.0 giới thiệu một phương thức mới Gate::inspect. Điều này giúp dễ dàng cung cấp tin nhắn tùy chỉnh cho người dùng trong các authorization request, chẳng hạn như thông báo lỗi cụ thể nếu request của họ bị từ chối.

Ví dụ, giả sử bạn có phương pháp bên dưới để xác định xem người dùng có được phép chỉnh sửa bài đăng hay không. Trước 6.0, rất khó để lấy lại tin nhắn này và hiển thị lại cho người dùng.

Với việc giới thiệu phương thức Gate::inspect(), giờ đây bạn có thể dễ dàng truy xuất toàn bộ response tùy chỉnh để gửi lại cho người dùng.

Nếu bạn muốn giới hạn việc chỉnh sửa bài đăng chỉ cho người dùng có role admin, bạn có thể đã tạo gate definition để chỉnh sửa bài đăng.

// App/Providers/AuthServiceProvider.php
...

public function boot()
{
    $this->registerPolicies();

    // Define the gate that determines who can edit posts
    Gate::define('edit', function ($user) {
        return $user->isAdmin
          ? Response::allow()
          : Response::deny('You must be an administrator to edit posts.');
    });
}
Thông thường bạn sẽ chỉ sử dụng phương thức allows hoặc denies để xem liệu người dùng đó có được phép thực hiện một hành động hay không. Response phụ thuộc vào phản hồi boolean từ phương thức Gate::define ở trên. Ví dụ sau đây sẽ không cung cấp cho bạn response tùy chỉnh, chỉ là boolean.

if (Gate::allows('edit')) {
  // let the user edit
}

if (Gate::denies('edit')) {
  // let the user edit
}
Nếu bạn muốn truy cập thêm denial response trùy chỉnh chi tiết hơn, bán có thể sử dụng Gate::inspect

// get the full authorization response returned by the gate
$response = Gate::inspect('edit');

if ($response->allowed()) {
  // Let the user edit the post
} else {
  // Display the denial message
  // 'You must be an administrator to edit posts.'
  echo $response->message();
}
Auth0 cũng cung cấp một cách đơn giản và nhanh gọn để add authorization vào Laravel API của bạn.

Laravel UI composer package

Một cập nhật khác cần lưu ý là extraction của package laravel/ui. Khung Front-end vẫn sẽ tồn tại, nó chỉ không được included theo mặc định. Điều này có nghĩa là trong một ứng dụng Laravel 6.0, bạn sẽ không thấy bất kỳ một khung Vue hoặc Bootstrap nào.

Package này bao gồm các cài đặt trước cho React, Vue và Bootstrap. Trong một tweet vào tháng 5, Otwell đề cập rằng anh ấy cũng đang cân nhắc thêm tùy chọn Tailwind!

Nếu bạn vẫn thích nó được included, bạn có thể mang nó trở lại với composer require laravel/ui command.

New branding

Với mỗi bản release chính, cũng đã có thương hiệu mới đi kèm với nó, và 6.0 cũng không ngoại lệ!

Ngoài logo mới ở trên, bạn cũng có thể tìm thấy một thiết kế lại mới của trang web Laravel.com.

Laravel Vapor

Và cuối cùng nhưng không kém phần quan trọng, việc release Laravel 6.0 cũng bao gồm việc ra mắt một sản phẩm được mong đợi nhiều trong hệ sinh thái Laravel - Laravel Vapor.



Trước khi release, hầu hết mọi người đã sử dụng Laravel Forge để cung cấp và triển khai các ứng dụng của họ. Với Forge, bạn có thể kết nối máy chủ đã chọn (Digital Ocean, AWS, v.v.) và Forge sẽ cung cấp cụ thể cho ứng dụng Laravel của bạn. Điều này là tuyệt vời, tất nhiên, nhưng bạn vẫn phải quản lý cập nhật cho chính mình.

Laravel Vapor làm tất cả những điều này và hơn thế nữa. Thay vì tự mình quản lý và cập nhật máy chủ cho ứng dụng Laravel của mình, Vapor hoàn toàn không có máy chủ (serverless)!

Điều này không có nghĩa là không có máy chủ liên quan, nó chỉ có nghĩa là bạn không phải đối phó với chúng. Một lợi ích khác là bạn chỉ trả tiền cho những gì bạn sử dụng. Thay vì trả một mức giá cố định hàng tháng, bạn chỉ bị tính phí khi request được gửi đến ứng dụng của bạn. Điều này cũng có nghĩa là bạn không phải lo lắng về việc mở rộng quy mô, vì nó sẽ tự động được thực hiện cho bạn.

Dưới đây là một số tính năng tuyệt vời mà Vapor cung cấp:
  • On-demand scaling - Can execute jobs immediately as they come in
  • Powered by AWS
  • Ready for bursts of traffic
  • Zero downtime during deployment
  • Extremely fast
  • Multiple environments with free vanity URL for testing (https://snowy-hurricane-12349834324432.vapor.build)
  • Maintenance mode
  • Searchable logs
  • Create and scale your databases from Vapor
  • Backup and restore databases
  • Metrics and monitoring with notifications
  • Purchase domains and manage DNS from Vapor dashboard
  • Automatically added SSL certificates
  • Jobs, workers, PHP updates, and more are handled behind the scenes
  • Deployment easily configured with a simple vapor.yaml file

Chi phí cho tất cả điều này là $39 mỗi tháng hoặc $399 mỗi năm với số thành viên nhóm và dự án không giới hạn. Hãy nhớ rằng, bạn vẫn phải trả chi phí AWS của riêng bạn ngoài điều đó.

Theo viblo.asia
Xem thêm

Thứ Hai, 12 tháng 8, 2019

Tìm file đã sửa mới nhất trong thư mục PHP

09:20 0
Có rất nhiều dự án cần xử lý file trong php. Mình cũng đang gặp phải và đã trích bài toán này ra để lưu trữ vào blog này cho mình sử dụng về sau hoặc cho ai đó cần.

Bài toán:
Tìm file mới nhất của các file trong thư mục và hiển thị tên file và thời gian mới nhất của file bằng PHP.


Các bước:
1. Mở thư mục
2. Mở file
3. So sánh thời gian của file để lấy ra file mới nhất và thời gian mới nhất.
4. Đóng file
5. Hiển thị ra kết quả.

Đây là hình ảnh của thư mục mình muốn lấy:




Đoạn code file php:
<?php
$directory= "D:\backup\aws\Invoice";
$smallest_time=0;
$latest_file='';
if ($handle = opendir($directory)) {
    while (false !== ($file = readdir($handle))) {
        $time=filemtime($directory.'/'.$file);
        if (is_file($directory.'/'.$file)) {
            if ($time > $smallest_time) {
                $latest_file = $file;
                $smallest_time = $time;
            }
        }
    }
    closedir($handle);
$lastModified = date("Y/m/d H:i:s", $smallest_time); 
}
echo $latest_file.' - '.$lastModified;

Kết quả:




Hy vọng bài toán này sẽ giúp ích được cho các bạn.

Tham khảo thêm cách tìm thời gian mới nhất của file trong thư mục bằng PHP:

            $lastestTimeUserCoordination = array_values(File::allfiles(storage_path($backupInsertPath))); 
            $fixTime = 0;             
            foreach($lastestTimeUserCoordination  as $lastestTime){                 
                $currentModified  = filemtime($lastestTime);               
                if($fixTime < $currentModified ){
                    $fixTime = $currentModified ;
                    
                }                
            }
            $lastModified = date("Y年m月d日 H時i分s秒", $fixTime); 
Xem thêm

Thứ Sáu, 19 tháng 4, 2019

Cách gửi mail trong laravel Framework - phần 1

11:48 0
Phần 1: hướng dẫn cách gửi mail trong laravel framework qua SMTP của gmail.
Ứng dụng gửi mail được áp dụng rất nhiều trong các project, phần này mình hướng dẫn cơ bản về cách làm, vì mỗi ứng dụng có cách lấy dữ liệu khác nhau.
ưu điểm cách làm này, chờ post một bài rất chậm vì quá trình xử lý gửi mail. Sang phần 2 mình sẽ hướng dẫn cách xử lý gửi mail qua Queue.

Thông tin
 - Phiên bản laravel 5.8
 - Ứng dụng diễn đàn cơ bản gửi mail thông báo lại khi tạo thread thành công.
 - Sử dụng Resource Controller
 - Gửi mail bằng SMTP gmail

Cách làm
- Cấu hình trong file .env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME= Dia_chi_gmail
MAIL_PASSWORD= Mat_khau_gmail
MAIL_ENCRYPTION=tls

Chú ý:
Chắc chắn gmail của bạn đã tắt xác minh 2 bước

Bạn có thể kiểm tra lại theo cách sau:

  • Bật xác minh 2 bước.
  • Tắt xác minh 2 bước.
  • Đăng nhập bằng xác minh 2 bước.
  • Khóa bảo mật.
  • Cài đặt Google Authenticator
  • Thêm hoặc xóa máy tính đáng tin cậy.
  • Xóa mật khẩu ứng dụng.
  • Sử dụng điện thoại mới để nhận mã xác minh 2 bước.

Vào Cài đặt (setting) của mail, chọn Thay đổi Tùy chọn và khôi phục mật khẩu

Tắt xác minh 2 bước như hình dưới.


  OK, như vậy là cài đặt và xử lý phần gmail đã xong.
Giờ chúng ta bắt đầu vào ứng dụng.

Tạo view có tên là SendMailCreateThreadToSuccess.blade.php
<h2>Thank you for Post Thread on Forum Us!</h2>
<p>Title : <b>{{ $thread->title }}</b></p>
<p>Link : <b>http://ictsharing.com/{{ $thread->path() }} </b></p>
<h3>Thanks</h3>


Chuột phải vào thư mục project để mở Terminal và gõ lệnh sau:
 $ php artisan make:mail SendMailCreateThreadToSuccess
Sau khi tạo xong, file SendMailCreateThreadToSuccess.php sẽ nằm trong thư mục App\Mail như hình bên dưới.

Mở file app\mail\SendMailThreadToSuccess.php và cấu hình thêm
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\User;
use App\Thread;

class SendMailCreateThreadToSuccess extends Mailable
{
    use Queueable, SerializesModels;
    public $user;
    public $thread;
   
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(User $user, Thread $thread)
    {
  
        $this->user = $user;
        $this->thread = $thread;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('threads.sendMailCreateThreadToSuccess');
    }
}

Trong đó:
- use App\User: là Model của User truyền vào để lấy thông tin user cụ thể là mail
- use App\Thread: Model của Thread

Hàm __construct là hàm khởi tạo được truyền hai tham số User và thread
Hàm Build trả về view vừa tạo ở trên đó cũng chính là nội dung email gửi về cho tác giả tạo thành công thread.
Xem trên hình ảnh:


Trong controller:
 Nhận request, tạo thread và gửi mail thông báo khi tạo thành công.
 Xử lý ở hàm store như sau:
 
    public function store(Request $request, User $user)
    {
       
        $this->validate($request, [
            'title' => 'required',
            'body' => 'required',
            'channel_id' => 'required|exists:channels,id'
        ]); 
        
        $thread = Thread::create([
            'user_id' => auth()->id(),
            'channel_id' => request('channel_id'),
            'title' => request('title'),
            'body' => request('body')
        ]);
        
        // send mail to creator thread
        Mail::to($request->user(), $thread)->send(new SendMailCreateThreadToSuccess($user, $thread));

        return redirect($thread->path())
                ->with('flash', 'Your thread has been published');
    }

Xem trên hình ảnh:

 Mình chụp cả phần đầu để các bạn đừng quên thêm use Mail và use App\Mail\SendMailCreateThreadToSuccess;

Cuối cùng là xử lý hàm store

Ở đây, trong ứng dụng của các bạn chỉ chú ý đoạn
// send mail to creator thread
        Mail::to($request->user(), $thread)->send(new SendMailCreateThreadToSuccess($user, $thread));
Đoạn này để gửi mail cho người tạo thread và truyền thông tin thread vào view gửi về mail.

 => Như vậy là xong.
Giờ chúng ta thử tạo thread nhé!

Kết quả trả về mail


Cách gửi mail trong laravel 5.8 bằng SMTP của gmail đã thành công. Tuy nhiên, khi làm thành công các bạn sẽ thấy, khi nhấn publish sẽ phải đợi 3-4s để gửi mail thành công mới trả về thành công.
Phần 2 mình sẽ hướng dẫn cách gửi mail sử dụng hàng đợi mà hiện nay đang được sử dụng rất phổ biến.
Nếu có thắc mắc các bạn đừng ngại gửi comment phía dưới nhé!

Xem thêm

Thứ Hai, 8 tháng 4, 2019

XÂY DỰNG WEB FULLSTACK VỚI LARAVEL & VUEJS

13:14 0

Khoá học này giúp bạn cách xây dựng website đầy đủ với Laravel 5, Bootstrap 4, VueJS và các công nghệ khác.
Bạn tìm hiểu các tính năng cơ bản và nâng cao của Laravel, tích hợp Bootstrap 4, FontAwesome 5, viết và biên dịch mã Sass và mã Javascript và nhiều hơn nữa.
Khoá học bám sát với những dự án thực tế qua đó sẽ giúp bạn tự tin vào bản thân hơn để làm nền tảng xây dựng những dự án phức tạp hơn qua việc học các cách xử lý của tác giả. 
Tích hợp: Vue js & Ajax: Directive, list rendering, conditional rendering, class binding, style binding, components và nhiều cái khác giúp website có sức hút và tăng tương tác .
Download tại đây
Xem thêm

Thứ Ba, 12 tháng 3, 2019

Câu lệnh Xem danh sách route trong ứng dụng Laravel 5.x

09:40 0

Chúng ta hoàn toàn có thể sử dụng câu lệnh dưới đây để xem nhanh xem trong ứng dụng của mình có những Router nào
Sử dụng câu lệnh:
php artisan route:list
Các thiết lập về route trong Laravel 5.x cũng được thiết lập khác đi, các route cho web request được đưa vào routes\web.php, còn các request cho api được đưa vào routes\api.php.
c:\xampp\htdocs\adshare-original>php artisan route:list
+--------+--------------------------------+-------------------------------------------------------------------+------------------+----------------------------------------------------------------------------+--------------+
| Domain | Method                         | URI                              | Name             | Action                                              | Middleware   |
+--------+--------------------------------+-------------------------------------------------------------------+------------------+----------------------------------------------------------------------------+--------------+
|        | GET|HEAD                       | /                              |                  | App\Http\Controllers\MainController@main                                   | web          |
|        | GET|HEAD                       | admin-dashboard                              |                  | Closure                                              | web,auth,acl |
|        | GET|HEAD|POST|PUT|PATCH|DELETE | admin-dashboard/advertiser/ad-active/{ad_content_id}/{extracted?} |                  | App\Http\Controllers\AdvertiserController@activeAd                         | web,auth,acl |
|        | GET|HEAD                       | admin-dashboard/advertiser/ad-main/{campaign_id}/{status?}        |                  | App\Http\Controllers\AdvertiserController@mainAdminAd                      | web,auth,acl |
|        | GET|HEAD                       | admin-dashboard/advertiser/ad-review-list                         |                  | App\Http\Controllers\AdvertiserController@reviewAdminAd                    | web,auth,acl |
|        | GET|HEAD                       | admin-dashboard/advertiser/campaign-main                          |                  | App\Http\Controllers\AdvertiserController@mainAdminCampaign                | web,auth,acl |
|        | GET|HEAD                       | admin-dashboard/news                              | news.index       | App\Http\Controllers\NewsController@index                                  | web,auth,acl |
|        | POST                           | admin-dashboard/news                              | news.store       | App\Http\Controllers\NewsController@store                                  | web,auth,acl |
|        | GET|HEAD                       | admin-dashboard/news/calendar                              |                  | App\Http\Controllers\NewsController@postCalendar                           | web,auth,acl |
Thông tin thêm
Có thể sử dụng các tùy chọn đi cùng với các câu lệnh để lọc kết quả đầu ra, ví du:
$ php artisan routes --name=ho
Trả về các route có tên bắt đầu với ho, hoặc:
$ php artisan routes --path=c
trả về các route có path bắt đầu bằng chữ cái c.

Ngoài ra, bạn đặc biệt chú ý các câu lệnh xem danh sách route khác nhau trong các phiên bản Laravel.
Xem thêm

Post Top Ad

Your Ad Spot