Laravel의 세션 관리(인증 기능)에 대한 요약

17243 단어 Laravel

라이센스 수준


CALEB PORZIO가 만든 라벨용 포장입니다.
https://github.com/calebporzio/laracasts-livewire-datatable
https://laravel-livewire.com/
간단하게 동적 표 표시를 만들 수 있다
2019/11/26, CALEB PORZIO는 Laracasts에 튜토리얼 영상을 올렸다.
https://laracasts.com/series/guest-spotlight/episodes/3
CALEB PORZIO의 자습서 애니메이션을 참조하여 Books 동적 테이블 디스플레이를 만들었습니다.viewblade, Controller, 모델은 거의 그의 튜토리얼 영상 내용과 같다.

CALEB PORZIO의 github 샘플은 MySQL에서 움직이지 않습니다.


CALEB PORZIO는 sqlite를 통해 동작을 확인합니다.env의 DB_연결을 mysql로 변경할 때 움직이지 않습니다.app/Http/Livewire/CtactsTable 때문입니다.php는 order by``와 같은 SQL을 발행하기 때문에 13줄의public\$sortField;\$sortField='id'인쇄;변경되면 MySQL도 작동합니다.

Laravel project


Table


tables와authors표를 준비하고 seeder에서 500개의 기록을 작성합니다.적당한 팩토리도 만들어요.php artisan migrate; phpartisandb:seed에서 데이터를 준비합니다.
class CreateBooksTable extends Migration {
    public function up() {
        Schema::create('books', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');  // ←追加
            $table->unsignedInteger('author_id');  // ←追加
            $table->timestamps();
        });
    }
}
class CreateAuthorsTable extends Migration {
    public function up() {
        Schema::create('authors', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');  // ←追加
            $table->timestamps();
        });
    }
}
class BooksTableSeeder extends Seeder {
    public function run()
    {
        factory(\App\Book::class, 500)->create();  // ←追加
    }
}
class AuthorsTableSeeder extends Seeder {
    public function run()
    {
        factory(\App\Author::class, 3)->create();  // ←追加
    }
}

Livewire로 Books 일람 화면 만들기


Livewire 설치


합성기에 따라 설치하다
composer require livewire/livewire

make:livewire 제작 블레이드와 클래스

php artisan make:livewire books-table
다음 파일 만들기
CLASS: app/Http/Livewire/BooksTable.php
VIEW: resources/views/livewire/books-table.blade.php

routes/web.php


한 줄만 추가
Route::get('books', 'BooksController');

app/Author.php


books 테이블과의 관계만 추가합니다.
class Author extends Model
{
    protected $guarded = [];

    public function books()
    {
        return $this->hasMany(Book::class);
    }
}

app/Book.php


감사 테이블에 관계가 추가되었습니다.
검색 방법을 추가합니다.(CALEB PORZIO의 Contacts.php 참조. 기본적으로 동일합니다.)
class Book extends Model
{
    protected $guarded = [];

    public static function search(string $query)
    {
        $res = empty($query) ? static::query()
            : static::where('title', 'like', '%' . $query . '%');
        return $res;
    }

    public function author()
    {
        return $this->belongsTo(Author::class);
    }
}

app/Http/Controllers/BooksController.php

    public function __invoke(Request $request)
    {
        $books = \App\Book::paginate(); // ←この処理使われていない. $booksはBooksTable.phpで取得するから
        return view('books', ['books' => $books]);
    }

app/Http/Livewire/BooksTable.php


CALEB PORZIO의 app/Http/Livewire/CtactsTable.php와 차이가 많지 않다.나는 책시계를 약간 바꾸었다.
class BooksTable extends Component
{
    use withPagination;

    public $perPage = 10;
    public $search = '';
    public $sortField = 'id';
    public $sortAsc = true;

    public function clear() {
        $this->search = '';
    }

    public function sortBy($field) {
        if ($this->sortField === $field) {
            $this->sortAsc = !$this->sortAsc;
        } else {
            $this->sortAsc = true;
        }
        $this->sortField = $field;
    }

    public function render()
    {
        $books = \App\Book::search($this->search)
            ->orderBy($this->sortField, $this->sortAsc ? 'asc' : 'desc')
            ->paginate($this->perPage);
        return view('livewire.books-table', ['books' => $books]);
    }
}

resources/views/books.blade.php


추가@livewireAssets
@livewire('books-table)에서books-table.blade.php를 불러옵니다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Books</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.css">
    @livewireAssets
</head>
<body style="padding:8px;">
<h1>Books</h1>
<div class="container pt-4">
    @livewire('books-table')
</div>
</body>
</html>

/resources/views/livewire/books-table.blade.php


테이블 뷰 쓰기
wire:model、wire:click.prevent 설정이 있는 곳은 app/Http/Livewire/BooksTable입니다.php와 합작한 곳.
의 값은 BooksTable입니다.php의 $search와 동기화합니다.
  • 북스용으로 변경되었지만 CALEB PORZIO의 리소스/views/livewire/contacts-table.blade.php와 차이가 많지 않다.CALEB PORZIO 자습서 비디오를 참조하십시오.
  • <div>
        <div class="row mb-4">
            <div class="col form-inline">
                Per Page: &nbsp;
                <select wire:model="perPage" class="form-control">
                    <option>10</option>
                    <option>15</option>
                    <option>25</option>
                </select>
            </div>
    
            <div class="col">
                <input wire:model="search" class="form-control" type="text" placeholder="Search books...">
            </div>
        </div>
    
        <div class="row">
            <table class="table">
                <thead>
                <tr>
                    <th>ID</th>
                    <th>
                        <a wire:click.prevent="sortBy('title')" role="button" href="#">
                            Title
                        </a>
                    </th>
                    <th>
                        <a wire:click.prevent="sortBy('author_id')" role="button" href="#">
                        Author
                        </a>
                    </th>
                </tr>
                </thead>
                <tbody>
                @foreach ($books as $book)
                    <tr>
                        <td>{{ $book->id }}</td>
                        <td>{{ $book->title }}</td>
                        <td>{{ $book->author['name'] }}</td>
                    </tr>
                @endforeach
                </tbody>
            </table>
        </div>
    
        <div class="row">
            <div class="col">
                {{ $books->links() }}
            </div>
    
            <div class="col text-right text-muted">
                Showing {{ $books->firstItem() }} to {{ $books->lastItem() }} out of {{ $books->total() }} results
            </div>
        </div>
    </div>
    
    

    동작 확인

    php artisan serve
    
    브라우저로 실제로 이동해 보세요.
    대단해!움직여!한 줄도 안 쓰고 자바스크립트!
    CALEB PORZIO 대단해!
    관련 비디오
    https://laracasts.com/series/guest-spotlight/episodes/3

    좋은 웹페이지 즐겨찾기