Cách Tạo View Insert Trong Laravel

Cách Tạo View Insert Trong Laravel
Cách tạo view insert trong Laravel có khó không? Các bạn sẽ được tiếp tục tìm hiểu về vấn đề này qua bài chia sẻ dưới đây.

View có vai trò là cầu nối giao tiếp giữa ứng dụng PHP và người dùng cuối. Do đó, nó có nhiệm vụ khá quan trọng. Trong mô hình MVC của Laravel, các bạn đã được tìm hiểu về view. Bài chia sẻ này sẽ hướng dẫn các bạn cách tạo view insert trong Laravel như thế nào. Bạn nào đang dùng Laravel 8 thì nên theo dõi kỹ lưỡng hơn.  

 

Cách tạo View trong Laravel 8

 

Trong Laravel 8, các view sẽ được đặt trong thư mục resources/views. Nếu bạn muốn thay đổi thư mục, thì bạn vào config/view.php để thay đổi giá trị của paths. View hỗ trợ có đuôi là .html, .php, .css, .blade.php. Nếu trong 1 thư mục có cùng các view trùng tên, thì Laravel sẽ sắp xếp theo thứ tự ưu tiên này: .blade.php , .php, .css, .html. Ví dụ:

 

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Hoc.TV</title>
</head>
<body>
<h2>Xin chào 500 ae!</h2>
</body>
</html>

 

Thực hiện render view trong Laravel

 

Để có thể render view trong Laravel, các bạn chọn dùng hàm view() hoặc View::make(). Thực hiện theo cú pháp này: 

 

view($view, $data);
// hoặc
use \Illuminate\Support\Facades\View;
View::make($view, $data);

 

  • $view: path (đường dẫn) đến view (tính từ thư mục views)
  • $data: mảng data bạn muốn truyền vào trong view. Bạn không phải bắt buộc điền vào tham số này

 

Để hiểu rõ hơn, các bạn xem qua 3 ví dụ mẫu dưới đây.

 

Ví dụ 1

 

Bạn sẽ render view home.html theo như ví dụ trên. Đầu tiên, bạn mở file routes/web.php và thêm code vào. 

 

Route::get('/', function () {
    return view('home');
})->name('home');

 

Ví dụ 2

 

Bạn tạo 1 view và truyền data vào bên trong. Kế tiếp, bạn tạo file home.php theo đường dẫn resources/views và thêm 1 đoạn code như thế này:

 

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title><?=$title?></title>
</head>
<body>
<h2><?=$body?></h2>
</body>
</html>
Sửa lại file routes/web.php
Route::get('/', function () {
    return view('home', ['title' => 'hoc.tv', 'body' => 'Học học nữa, học mãi']);
})->name('home');

 

Kết quả dưới dạng viewsource:

 

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>hoc.tv</title>
</head>
<body>
<h2>Học học nữa, học mãi</h2>
</body>
</html>

 

Nếu view của bạn nằm ở thư mục con của resources/views, thì bạn có thể sử dụng dấu chấm (.) thay cho kí tự /.

 

Ví dụ 3

 

Với file view resources/views/home/index.php, bạn sẽ render như thế này: 

 

Route::get('/', function () {
    return view('home.index', ['title' => 'hoclaravel.vn', 'body' => 'Học nữa học mãi']);
})->name('home');

 

View first trong Laravel là gì?

 

Nếu bạn muốn render ra view được tồn tại đầu tiên trong danh sách view, thì bạn nên sử dụng phương thức first trong view object với cú pháp này:

 

use Illuminate\Support\Facades\View;
View::first($views, $data);

 

  • $views: đường dẫn đến view (tính từ thư mục views)
  • $data: mảng data bạn muốn truyền vào trong view và không bắt buộc các bạn phải điền vào

 

Xem ví dụ này:

 

use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);

 

Cách kiểm tra view có tồn tại trong Laravel hay không 

 

Để kiểm tra sự tồn tại của 1 view, các bạn chọn phương thức exists và đánh cú pháp như sau: 

 

use Illuminate\Support\Facades\View;
View::exists($view):

 

$view là đường dẫn đến view mà bạn muốn kiểm tra sự tồn tại của view. Ví dụ kiểm tra thư mực views có view nào có tên home hoặc không. 

 

use Illuminate\Support\Facades\View;
if (View::exists('home')) {
   // tồn tại
}

 

Cách truyền data cho tất cả view 

 

Để truyền 1 view cho tất cả view trong Laravel 8, bạn nên sử dụng phương thức share trong view object. Ứng dụng sẽ hoạt động tốt và chính xác khi và chỉ khi bạn đưa view share vào trong provider. Ví dụ bạn share data có tên là siteTitle cho tất cả view trong Laravel. File sẽ là Providers/AppServiceProvider.php.

 

<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('siteTitle', 'hoc.tv');
    }
}

 

Các bạn có thể dùng biến $siteTitle trong các view. 

 

View composer là gì?

 

View composer là 1 class hoặc 1 callback. Nó thường được gọi khi các bạn thực hiện view render. Nếu muốn đưa data vào view khi render, thì view composer cũng sẽ là 1 giải pháp đáng để thử. 

 

Ở một số trường hợp, nhiều view nên được dùng chung 1 đoạn logic. Lưu ý là không phải view nào cũng có thể áp dụng. Khi truyền vào view, bạn nên dùng view composer để hạn chế tình trạng code bị trùng lặp. Điều này giúp bạn đỡ mất thời gian phải đi dò lại từng dòng. 

 

Bạn cũng cần đăng ký view composer vào trong provider để hệ thống Laravel có thể nhận diện. Laravel có 2 cách để giúp chúng ta khai báo view composer. Bạn dùng closure hoặc class. Đối với view composer và chọn closure, thì bạn chỉ cần khai báo theo cú pháp sau: 

 

View::composer($views, function ($view) {
    //
});

 

$view là view bạn muốn tác động đến nó. Nếu muốn tác động lên nhiều view hơn, thì bạn truyền vào một mảng. Nếu bạn muốn tác động đến toàn bộ view, thì hãy khai báo $view = '*'. Ví dụ là bạn sẽ thêm $title vào trong view home, thì bạn cần sử dụng view composer. 

 

View::composer('home', function ($view) {
    $view->with('title', 'hoclaravel.vn');
});

 

Với view composer class, các bạn nên sử dụng cú pháp như thế này: 

 

View::composer($views, $className);

 

  • $view: tương tự như view composer closure
  • $className: tên của class chưa có logic composer. Class composer bắt buộc phải có method composer (có visibility là public) và nhận tham số truyền vào là 1 view object. 

 

Chúng ta hãy cùng xem ví dụ tương tự như ví dụ trên nhưng chỉ sử dụng view composer class. Chúng ta sẽ có file app/Http/View/Composers/SiteNameComposer.php.

 

<?php
namespace App\Http\View\Composers;
use App\Repositories\UserRepository;
use Illuminate\View\View;
class SiteNameComposer
{
    /**
     * The user repository implementation.
     *
     * @var \App\Repositories\UserRepository
     */
    protected $users;
    /**
     * Create a new profile composer.
     *
     * @param  \App\Repositories\UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        // Dependencies automatically resolved by service container...
        $this->users = $users;
    }
    /**
     * Bind data to the view.
     *
     * @param  \Illuminate\View\View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('title', 'hoclaravel.vn');
    }
}

 

Các bạn đừng quên khai báo trong provider.

 

use App\Http\View\Composers\SiteNameComposer;
View::composer('home', SiteNameComposer::class);

 

Cách tạo view cho trang chèn dữ liệu

 

Các bạn truy cập thư mục /resources/views/user / và tạo file PHP news_create.blade.php

 

<form method="post" action="/user/news/store">
 <input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">
    <p>
        <label for="title">Name</label><br>
        <input type="text" name="name" value="">
    </p>
    <p>
        <label for="email">Email</label><br>
        <input type="text" name="email" value="">
    </p>    
     <p>
        <label for="email">Password</label><br>
        <input type="password" name="password" value="">
    </p>   
    <p>
        <button type="submit">Submit</button>
    </p>
</form>

 

Cách tạo Resource Controller để điều khiển và xử lý truy vấn đến từ View

 

Các bạn có thể tạo 1 file controller để xử lý tất cả.

 

php artisan make:controller User_Controller - -resource
Tạo truy cập vào controller theo đường dẫn App\Http\Controllers\User_Controller.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class User_Controller extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }
    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }
    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }
    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }
    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

 

Cách sửa Controller để trả về trang chèn dữ liệu

 

Các bạn bổ sung nội dung cho function create() của Controller User_Controller để gọi trang view insert:

 

/**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('/user/news_create');
    }

 

Khai báo route 

 

Các bạn thêm vào Route/routes/web.php theo cú pháp sau: 

 

use App\Http\Controllers\User_Controller;
Route::get('/user/news/create',[User_Controller ::class,'create']);

 

Cách insert dữ liệu 

 

Trong view, các bạn tiến hành insert dữ liệu /resources/views/user/news_create.blade.php bằng cách cho form khi nhấn submit thì sẽ thực hiện 1 hành động đến  /user/news/store. Do đó, bạn cần tạo 1 controller để xử lý dữ liệu nhập và chọn 1 route điều hướng đến controller này. 

 

Điều chỉnh nội dung route 

 

Các bạn thêm vào Route /routes/web.php theo cú pháp này: 

 

use App\Http\Controllers\User_Controller;
Route::get('/user/news/create',[User_Controller::class,'create']);
Route::post('/user/news/store',[User_Controller::class, 'store']);

 

Xử lý controller 

 

Các bạn tiến hành xử lý nội dung được insert dữ liệu cho controller. Nên đánh lại Controller /app/Http/Controllers/User_Control.php ở phần khai báo và cho public function store(Request $request). Đừng quên khai báo đầu file.

 

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect;
*************************************
public function store(Request $request)
    {
         $name = $request->input('name');
         $email= $request->input('email');
         $password=$request->input('password');
         DB::table('users')->insert([
            'name' => $name,
            'email' => $email,
            'password' => $password,
        ]);
        action([User_Controller::class, 'create']);
        return Redirect::action([User_Controller::class, 'create']);        
    }

 

Các bạn vào trang http://localhost:8000/user/news/create để chèn dữ liệu vào. Kiểm tra lại DB, bạn sẽ thấy các user mới đã được bổ sung.

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (0)