2. web.php에서 Route 를 만들어 contact 페이지로 갈 수 있도록 다리를 연결해줍시다.
Route::get(‘/contact’, function ( ) {
return view(‘contact’);
});
3. /contact 로 접속하면 우리가 만들었던 view가 잘 출력되고 있음을 확인할 수 있습니다.
Router ➡ Controller ➡ View
Controller는 특정 페이지에서 submit을 눌렀을 때 데이터가 제대로 매칭이 되는지 입력값이 데이터베이스에 존재하는지 등을 확인하는 역할을 합니다. 이 또한 실습을 진행해 학습하도록 하겠습니다.
D:\Bitnami\apache2\htdocs\blog1>php artisan make:controller Blogcontroller
Controller created successfully.
cmd에서 명령어를 사용해 Blogcontroller를 생성합니다. app/Http/Controllers/Auth 에 Blogcontroller.php가 생성되었습니다.
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class Blogcontroller extends Controller
{
public function door()
{
return view(‘blog’);
}
}
door함수를 호출 받으면 blog view를 보여주는 함수를 만듭니다. blog view도 만들어야겠지요? 내용은 아무내용이나 입력하셔도 좋습니다.
해당 코드는 /blog 경로로 가게 되면 BlogController의 door 함수를 호출한다는 의미입니다. 실제로 /blog 경로로 접속을 하면 blog view가 잘 출력됨을 확인할 수 있습니다.
Router ➡ Controller ➡ Model ➡ View
많은 사람들이 라라벨을 사용하는 이유 중 하나가 위의 네가지 과정을 손쉽게 전부 사용할 수 있다는 것입니다. 자세한건 DB를 활용하는 페이지를 제작해보는 실습을 진행해봅시다.
D:\Bitnami\apache2\htdocs\blog1>php artisan make:model Blog -mc
Controller created successfully.
Created Migration: 2020_11_19_075739_create_blogs_table
cmd창에서 명령어를 이용해 model, migration, controller를 생성합니다. ( -mc가 migration과 controller를 같이 생성하라는 의미 ) 이제 슬슬 명령어 프롬프트 창과 친해졌을까요? 어색해도 괜찮습니다. 저도 리눅스를 사용해봤음에도 불구하고 N년째 어색해하는 중이니까요. 설치 중 'Controller already exists!'와 같은 경고가 뜰 수 있습니다. 말 그대로 이미 Controller는 설치되어있다는 의미니 그렇구나 하고 넘어가시면 됩니다.
이중 migrations 폴더의 어쩌고저쩌고_blogs_table.php 에서 DB의 테이블과 값에 대한것을 설정할 수 있습니다.
public function up()
{
Schema::create('blogs', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedInteger('user_id');
$table->string('title');
$table->text('body');
$table->timestamps( );
});
}
이게 뭐냐고요? 데이터베이스의 테이블을 생성해주는 코드입니다. 일단 따라 쳐보세요. 우리가 이 파트에서 이해하고자 하는 것은 Laravel의 작동원리입니다. 만약 DB연결을 진행하지 않았다면 DB연결을 먼저 진행해주세요. 명령 프롬프트에서 실행되지 않은 전체 마이그레이션을 실행시킵니다.
데이터 매칭 확인역할을 해줄 controller를 수정해줍시다. Blogcontroller.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Blog; // Blog 모델과 연결해주는 역할
class Blogcontroller extends Controller{
public function door( ){
return view(‘blog’);
}
public function create( ){
return view(‘create’);
}
public function store(Request $request){ // 입력값을 조회하기 위한 함수
Blog::create([
‘user_id’ => $request->user( )->id, // 로그인 된 유저 id를 받아옴
‘title’ => $request->title,
‘body’ => $request->body,
]);
return redirect( )->back( ); // 다시 create view 페이지로 돌아오게 함
}
}
이제 연결다리 역할을 하는 route를 수정해줍시다
<?php
use Illuminate\Support\Facades\Route;
Route::get(‘/contact’, function ( ) {
return view(‘contact’);
});
Route::get(‘/’, function ( ) {
return view(‘welcome’);
});
Auth::routes( );
Route::get(‘/home’, ‘HomeController@index’)->name(‘home’);
Route::get(‘/blog’, ‘Blogcontroller@door’)->name(‘door’);
Route::get(‘/create’, ‘Blogcontroller@create’);
Route::post(‘/create’, ‘Blogcontroller@store’)->name(‘store’);
get이 아니라 post를 사용한 후 ->name('store');를 붙여주는 이유는 라우터에 이름을 지정하여 경로(url) 또는 리다이렉션을 생성할 때 해당 라우터 이름을 사용하기 위함입니다.
모델역할을 하는 Blog.php에는 입력 값으로 받을 테이블 명들을 입력해줍니다.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model
{
protected $fillable = [
‘user_id’, ‘title’, ‘body’,
];
}
이제 create 페이지에 접속해서 데이터를 입력했을 시 정상적으로 작동하는지 확인합니다. 정상작동이 된다면 리다이렉트로 인해 create 첫 페이지로 돌아올 것입니다. 데이터베이스에도 입력한 뎅이터가 잘 들어갔는지 확인해줍니다.
5. Laravel로 로그인 시스템 구현하기
실습은 서버를 킨 상태로 진행합니다.
💀 코드를 수정하더라도 즉시 반영이 되는게 아니라 잠시 후에 반영이 되는 경우 Bitnami\php\php.ini의 설정 중 opcache.enable=1 를 찾습니다. 요것은 php 수정 시 30초~1분 뒤에 반영하기 때문에 개발 중에는 opcache.enable=0 으로 변경하면 즉시 반영이 가능하게 할 수 있습니다. 다음 opcache.revalidate_freq=60 을 찾습니다. 이것은 60초 뒤에 php 파일 변경이 적용된다는 소립니다. 1분 1초가 소중한 상황에서는 못기다립니다. opcache.revalidate_freq=0 으로 변경해 적용되는 것을 0초로 변경해줍시다.
.env 파일에서 DB 이름과 패스워드를 입력합시다. 이때 패스워드는 APM 설치시 입력했던 패스워드입니다.
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=[ 데이터베이스 이름 ] DB_USERNAME=root DB_PASSWORD=[ 패스워드 ]
라라벨은 기본적으로 미리 만들어진 테이블이 존재합니다.
database\migrations 에서 미리 만들어진 테이블을 확인할 수 있습니다.
그중 ~_password_rest_table.php을 열면 아래와 같은 코드를 확인할 수 있는데요.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePasswordResetsTable extends Migration
{ /**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('password_resets');
}
}
이것은 비밀번호 리셋기능을 담당하는 테이블입니다. 놀랍지 않나요. 비밀번호 리셋기능이 있는 테이블이 기본적으로 존재한다니...
public function up(){
Schema::create(‘cacaos’, function (Blueprint $table) {
$table->id();
$table->text(‘title’);
$table->string(‘body’);
$table->timestamps();
});
}
코드 작성 후 마이그레이션을 해줍니다.
> php artisan migrate
마이그레이션이 완료된 후 테이블이 잘 생성되었는지 확인해주세요. 만약 마이그레이션을 잘못 입력해서 다시 되돌리고 싶을 경우에는 rollback 명령어 이용하면 가장 최근에 마이그레이션을 실행한 내용을 취소시킬 수 있습니다.
> php artisan migrate:rollback
resoures/views 에 cacao 디렉터리를 생성하고 view 파일을 생성합니다. 그리고 해당 모델로 가서 대량할당이 가능하도록 설정해줍니다. app/cacao.php
class cacao extends Model{
protected $fillable = [‘title’, ‘body’,];
}
데이터베이스의 테이블에 데이터가 비어있으니 팅커콘솔로 인서트해줍니다.
> php artisan tinker
직접 MySQL에서 값을 임의로 삽입하는 방법도 있습니다.
INSERT INTO `cacaos`(title, body) VALUES ('title1','body');
INSERT INTO `cacaos`(title, body) VALUES ('title2','body');
INSERT INTO `cacaos`(title, body) VALUES ('title3','body');
INSERT INTO `cacaos`(title, body) VALUES ('title4','body');
데이터 값을 잘 호출해오는지 테스트를 진행해야합니다. 먼저 게시판 목록 페이지로 가는 라우터 설정을 해줍니다. routes/web.php
Route::get(‘/cacaos’, ‘CacaoController@index’);
cacao 컨트롤러에서 데이터베이스의 데이터를 불러오도록 코드를 변경합니다 App/Http/Controllers/CacaoController
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class CacaoController extends Controller{
protected function index(){
$cacaos = \App\cacao::all();
return $cacaos;
}
/cacaos 에 접속하면 입력했던 테이블에 있는 데이터들이 페이지에 출력되고 있음을 확인할 수 있습니다.
2. 리스트
CacaoController.php
class CacaoController extends Controller{
protected function index(){
$cacaos = cacao::all();
return view(‘cacao.index’, compact(‘cacaos’));
}
}
index메서드에 view를 지정하고 데이터를 불러와 view에 위임합니다. 이때 compact에 들어가는 cacao는 위에서 지정한 변수 ($cacao) 입니다.