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와 동기화합니다.
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와 동기화합니다.
composer require livewire/livewire
php artisan make:livewire books-table
Route::get('books', 'BooksController');
class Author extends Model
{
protected $guarded = [];
public function books()
{
return $this->hasMany(Book::class);
}
}
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);
}
}
public function __invoke(Request $request)
{
$books = \App\Book::paginate(); // ←この処理使われていない. $booksはBooksTable.phpで取得するから
return view('books', ['books' => $books]);
}
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]);
}
}
<!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>
<div>
<div class="row mb-4">
<div class="col form-inline">
Per Page:
<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
Reference
이 문제에 관하여(Laravel의 세션 관리(인증 기능)에 대한 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hot_study_man/items/c7e081d51ec29272c326
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
php artisan serve
Reference
이 문제에 관하여(Laravel의 세션 관리(인증 기능)에 대한 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hot_study_man/items/c7e081d51ec29272c326텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)