안녕하세요 이번엔 뷰(블레이드 템플릿)에 대해 알아보도록 하겠습니다.

뷰는 디폴트로 resources/views에서 관리하고 있습니다.

 

라라 벨에서는 특수 템플릿이 있으며, blade의 확장자를 붙여 사용 가능합니다.

예를 들어보겠습니다.

test.blade.php

// test.blade.php
<html>
<head></head>
<body></body>
</html>

blade들 사용함으로써 사용 가능한 기능들에 대해 알아보도록 하겠습니다.

{{ }}

{{}} 를 사용하여 php 변수들을 바로바로 사용 가능합니다.

// test.blade.php
<html>
<head></head>
<body>
 {{ $data="테스트" }}
 {{ $data }}
</body>
</html>

 

레이아웃

@extends

@section

@yield

을 이용하여 레이아웃을 정의하거나 확장할 수 있습니다.

<head>
 <title>@yield('title')</title>
</head>
<body>
 @section('navigation')
  navigation
 @show
</body

 

반복문

foreach

{{ $data = [1,2,3,4,5] }}
@foreach($data as $index => $value)
 {{ $index}}:{{ $value }}
@endforeach

for

@for($i=1; $i<=10; $i++)
 {{ $i }}
@endfor

switch

@switch($number)
    @case(1)
        일
        @break
    @case(2)
        이
        @break
    @default
      다른숫자
@endswitch

@붙여 매우 간단히 foreach, for switch 구문을 사용할 수 있습니다.

 

조건문
@if($data == 1)
 하나
@elseif($data == 2)
 둘
@else
 다른 숫자
@endif

조건문은 if문을 사용할 수 있으며,

반복문과 마찬가지로 @를 붙여 사용할수 있습니다.

 

 

CSRF

라라 벨에서 특수한 경우가 있는데, form를 이용하여 post를 할 경우엔 CSRF를 붙여주시는 게 좋습니다.

<form method="POST" action="/post">
    @csrf
</form>

blade의 @csrf를 이용하여 사용 가능합니다.

별도의 설정 없이 post를 할 경우 @csrf를 사용하지 않는 경우에는 에러가 발생합니다.

 

CSRF에 대해서는 위키피디아를 참고하였습니다.

Cross-Site Request Forgery (CSRF) (크로스 사이트 요청 변조) CSRF공격은 로그온 된 피해자의 취약한 웹 애플리케이션에 피해자의 세션 쿠키와 기타 다른 인증정보를 자동으로 포함하여 위조된 HTTP 요청을 강제로 보내도록 하는 것이다. 이것은 공격자가 취약한 애플리케이션이 피해자로부터의 정당한 요청이라고 오해할 수 있는 요청들을 강제로 만들 수 있다.

 

 

안녕하세요 라라벨에서 데이터베이스 사용법에 대해 알아보도록 하겠습니다.

우선 라라벨에서 현재 4가지의 데이터베이스를 지원하고 있습니다.

  • MySQL
  • PostgreSQL
  • SQLite
  • SQL Server

데이터베이스를 연결하는 방법은 config/database.php으로 가서 원하는 데이터베이스를 작성해주시면됩니다.

예제를 보겠습니다.

'mysql' => [
    'read' => [
        'host' => ['192.168.1.1'],
    ],
    'write' => [
        'host' => ['196.168.1.2'],
    ],
    'sticky'    => true,
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix'    => '',
],

위의 예제는 라라벨공식홈페이지의 예제입니다.

read와 write를 설정할수 있으며, 하나로 통일 하고싶은 경우는 read,write를 사용하지않고,

host => 192.168.1.2를 이용하여 바로 연결시켜 사용하면 됩니다.

 

기본쿼리에 대해 알아보도록 하겠습니다.

select
DB::select('select * from users where active = ?', [1]);
insert 
DB::select('select * from users where id = :id', ['id' => 1]);
update
DB::update('update users set votes = 100 where name = ?', ['John']);
delete
DB::delete('delete from users');

위의 기본쿼리들을 보시면 DB파사드를 이용하고 있으며 select, insert update 구문은, ?를 이용하여 좀더 인수로써 이용 하는 것을 알수있습니다.

 

또한 DB파사드에는 트랜잭션이 존재합니다.

예제를 살펴보겠습니다.

try {
 DB::transaction(function() use() {
  // query작성
})
}catch(Exception $e) {
 
}

try catch문을 이용하면 더욱 좋습니다.

트랜잭션의 클로져안에서 쿼리가 완벽하게 다 진행되었다면, 그대로 커밋을 할것이며, 실패한다면, rollback을 할 것입니다.

또한 주목할점은 보통 트랜잭션의 클로져에서는 클로져밖의 변수는 사용할수 없습니다. 

아래의 예제를 보시면

try {
 $name = "hello"
 DB::transaction(function() use($name) {
  DB::select("select * from users where name=?", [$name])
})
}catch(Exception $e) {
 
}

use()를 사용함으로써, 밖에서 사용하던 변수라도 클로져 안에서 사용할수 있도록 합니다.

 

다음으로 쿼리빌더에 대해 알아보도록 하겠습니다.

 

쿼리빌더

쿼리빌더는 PDO 파라미터 바인딩을 사용하여 SQL injection 공격을 방지를 위해 사용할수 있으며, sql을 간단하게 작성할수 있습니다.

 

예제를 들어보겠습니다.

DB::table("test")->get(); // 모든 데이터 조회
DB::table("test")->first(); // 하나의 데이터만 조회
DB::table("test")->where("id","3")->get(); // where문 사용하여 해당되는 데이터 모두 조회
DB::table("test")->join("test2","test2.id","=","test.id")->get(); // join문을 사용을 사용하여 모든 데이터 조회

위의 예제들을 보시면 알수 있지만, 쿼리빌더를 이용함으로써 복잡한 sql문이 보다 간결히 작성 되는 것을 알수 있습니다. 

 

위의 간단한 예제뿐만아니라 더욱 더 많은 기능들이 있습니다.

https://laravel.kr/docs/5.8/queries

 

라라벨 5.8 - 쿼리 빌더

라라벨 한글 메뉴얼 5.8 - 쿼리 빌더

laravel.kr

나머지 기능들은 공식 홈페이지를 통해 알아보시면 될듯 합니다. :)

안녕하세요 오늘은 라라 벨의 라우팅과 미들웨어에 대해 알아보도록 하겠습니다. :)

 

 

라라 벨의 라우팅은 대표적으로 get과 post를 이용하여 URI와 클로저를 전달 받아, 라우팅을 정의하고 있습니다.

제일 기본 예제를 알아보도록 하겠습니다.

Route::get("get-test", function (){
 return "get-test"
});

Route::post("post-test", function (){
 return "post-test"
});

위의 예제가 가장 기본적인 get과 post를 이용하여 작성한 라우팅입니다.

여기서 복습하자만 Route는 전 포스팅에서 공부한 내용인 프로바이더와 파사드를 이용하여 Route를 정적 메서드로써 사용할 수 있습니다.

 

또한, 

put, patch, delete, options등의 메서드도 있습니다.

PHP의 PSR7형식을 따르고 있습니다.

라우팅 과정에서 POST의 경우에는 CSRF 토큰 필드를 사용해야 합니다.

CSRF토큰 필드를 포함하지 않을 경우 request는 전달되지 않습니다.

 

라우팅에 미들웨어를 사용할 수도 있습니다.

그전에 미들웨어가 뭔지 알아보도록 하겠습니다.

미들웨어는 HTTP 요청을 간편하게 필터링할 수 있는 방법을 제공합니다.

예제를 들어보겠습니다.

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('home');
        }

        return $next($request);
    }
}

위의 예제는 라라 벨 공식 홈페이지의 예제입니다.

살펴보면, handle메서드 안에 원하는 HTTP라우팅을 할 때 원하는 작업을 작성해 주시면 됩니다.

위의 예제는 age가 200보다 작으면 redirect 아니면 $next($request)를 이용하여, 계속 진행한다는 의미로 받아들이면 됩니다.

 

그 후, app/Http/Kernel.php안에 미들웨어를 등록한 후,

protected $routeMiddleware = [
    'checkAge' => CheckAge::class,
];

라우팅을 할 때 사용하고 싶다면,

Route::middleware("checkAge", function() {
 Route::get("test", function(){
  return "ok";
 });
});

위의 예제처럼 사용하시거나,

Route::get("test", function () {
    return "ok"
})->middleware('checkAge');

위의 예제처럼 사용하시면 됩니다.

 

또한 미들웨어 그룹을 이용하여, 라우팅 하는 순간뿐만 아니라, 별다른 설정 없이 모든 리퀘스트에 대하여, 미들웨어를 설정 포함시키는 방법도 있습니다.

protected $middlewareGroups = [
    'web' => [
        AgeCheck::class,
    ],
];

위의 예제처럼 사용하시면 됩니다.

여기서 중요한 포인트는 미들웨어에 순서가 존재하기 때문에, 미들웨어를 추가할 경우에는 순서를 잘 생각하여야 합니다. 또한 순서는 app/Http/Kernel.php 파일의 protected $middlewarePriority속성을 이용하여 우선순위를 정할 수 있습니다.

 

 

여기까지 라우팅과 미들웨어에 대해 알아보았습니다 :)

다음 포스팅에는 데이터베이스에 대해 알아보도록 하겠습니다.

안녕하세요 오늘은 서비스 프로바이더와 파사드에 대해 알아보도록 하겠습니다.

 

서비스 프로바이더의 역할은 서비스컨테이너에 바인딩을 등록하는 역할을 합니다.
프로바이더는 register 와 boot 메소드를 가지고 있습니다.
register의 역할은 서비스컨테이너에 등록하는 역할을 수행합니다.
예제를 들어보겠습니다.

<?php 

namespace App\Providers; 

use Riak\Connection; 
use Illuminate\Support\ServiceProvider; 

class RiakServiceProvider extends ServiceProvider 
{ 
    /** 
     * Register bindings in the container. 
     * 
     * @return void 
     */ 
    public function register() 
    { 
        $this->app->singleton(Connection::class, function ($app) { 
            return new Connection(config('riak')); 
        }); 
    } 
} 


위의 예제는 라라벨 공식홈페이지의 내용입니다.
RiakServiceProvider클래스를 만들고  serviceProvider를 상속받습니다.
그후 레지스터 메서드를 작성하고 그안에 $this-app을 이용하여 서비스컨테이너에 등록하고 싶은 클래스를 등록합니다.
boot 메소드는 모든 서비스프로바이더의 register가 작업을 수행한 뒤 실행됩니다.

부트스트래핑 과정에 필요한 작업이 있다면 작성하여 사용 하면 됩니다.
마지막으로 config/app.php에 서비스 프로바이더를 등록하여 사용하면 됩니다.

 

파사드

파사드는 쉽게 말해서 static 메서드의 제공입니다.

보통 클래스들은 static을 붙여 정적 클래스를 제공하지만, 파사드를 사용하면 static을 붙이지 않고서도 정적메서드로써 사용가능합니다.

예제를 보며 알아보겠습니다.

class Test extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return "test";
    }
}

Facade클래스를 상속받아, getFacadeAccessor메서드 안에 정적클래스로 사용하고싶은 클래스를 작성해 줍니다.

우선 파사드 클래스를 상속받아 getFacadeAccessor메서드 안에 정적클래스로 사용하고싶은 클래스를 작성해 줍니다.
그후 return 값의 값을 이용하여 서비스컨테이너로 부터 test 라는 이름의 바인딩 객체를 찾아 메소드를 호출합니다.

 

즉, 파사드를 사용하기 위해선 서비스 프로바이더의 등록도 필요하다는 것을 알수 있습니다.

그리고 파사드도 app/config.php에 이름을 등록하여 사용해 줍니다.

 

여기까지 서비스 프로바이더와 파사드를 알아보았습니다.

다음 포스팅에는 라라벨의 기능들에 대해 알아보도록 하겠습니다.

안녕하세요 이번에는 라라 벨의 서비스 컨테이너에 대해 알아보도록 하겠습니다!

전 처음에 이 서비스 컨테이너에 정의가 제대로 잡히지 않아서 좀 고생했었습니다. :(

우선!

 

라라벨 홈페이지에 나오면 서비스 컨테이너의 정의부터 보시면,

라라 벨의 서비스 컨테이너는 클래스의 의존성을 관리하고 의존성을 주입하는 강력한 도구입니다. 의존성 주입이라는 멋진 말의 의미는 다음과 같습니다: 클래스 간의 의존성은 클래스 생성될 때 또는 경우에 따라 "setter" 메서드에 의해서 "주입" 된다는 의미입니다.

라는 말이 나와있습니다.

 

여기서 의존성주입 이란 단어를 이해하시면 라라 벨 서비스 컨테이너에 대해 보다 쉽게 접근하실 수 있습니다.

의존성 주입이란, 기존에 존재하는 디자인 패턴 중의 하나로 DI (Dependency Injection)이란 말로 많이 알려져 있습니다.

(구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부의 설정 파일 등을 통해 정의되게 하게 만드는 것)

 

??

소스코드 내부가 아닌 외부의 설정 파일이라.. 무슨 말이지??라고 생각하실 수 있습니다.

여기서 의존성 주입이라는 단어를 제외하고 코드를 한번 작성해 보겠습니다.

class TestLaravel{
 public function __construct() {
  $sql = new Mysql();
 }
}

class Mysql {
}

class Test {
 public function test(){
  $testLaravel = new TestLaravel();
 }
}

위의 코드에서 문제점이 보이시나요?

겉보기엔 아무 문제없는 코드인데 뭐가 문제지?라는 생각을 하실 수 있습니다.

 

하지만 TestLaravel 클래스는 Mysql클래스를 의존하고 있는 것입니다.

이게 왜?라는 질문이 있을 수 있습니다.

 

만약 여기서 Test클래스는 Mysql 말고 MongoDB도 필요한 작업들이 생긴다고 가정해보겠습니다.

그렇게 되면 TestLaravel은 mongoDB를 가져오는 인스턴스를  만들어야 하는 작업들이 귀찮은 작업들이 생기게 되는 겁니다. 이게 1~2개면 뭐 상관없지만, 100개 200개 300개가 되는 순간 지옥의 시작입니다.. :(

 

여기서 저희들은 의존성 주입이란 것을 이용해 보도록 하겠습니다.

class TestLaravel{
 protected $sql = null;

 public function __construct(DBInterface $sql) {
  $this->sql = $sql
 }
}

class Mysql implements DBInterface{
}
class MongoDB implements DBInterface{
}

interface DBInterface {
}


class Test {
 public function test(){
  $mongoDB = new MongoDB();
  $mysql = new Mysql();
  $mongoDBTestLaravel = new TestLaravel($mongoDB);
  $mysqlTestLaravel = new TestLaravel($mysql);
 }
}

달라진 점은 interface를 이용한다는 점!

이렇게 함으로써 TestLaravel을 사용할 때 mongoDB가 됐든, mysql이 됬든 상관없이 먼저 인스턴스를 만들고 값을 넣어줌으로써, TestLarvel클래스는 수정 없이 바로바로 사용할 수 있게 된다는 점입니다!

 

이제 여기까지 의존성 주입을 알아봤는데요.

이게 왜 서비스 컨테이너랑 무슨 상관인데?라는 의문이 들 수 있습니다.

 

서비스 컨테이너는 프로바이더의 $this->app 속성을 통해서 컨테이너 인스턴스에 접근할 수 있다는 점입니다.

(프로바이더는 다음장에 배우도록 하겠습니다.)

$this-app이 서비스 컨테이너 자체이자 위의 예제에서 썼던 인터페이스 역할을 하고 있는 것입니다.

 

예제를 보겠습니다.

$this->app->bind('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

위의 예제는 라라 벨 공식 홈페이지의 예제입니다.

$this-app을 이용하여 컨테이너 인스턴스에 접근한 뒤 bind메서드를 사용하여 HelpHelpSpot\API의 인스턴스를 의존성 주입하는 모습입니다.

 

여기서 딱 한 번만 더 강조하자면 $this-app이 서비스 컨테이너 인스턴스에 접근할 수 있다는 점! 

 

이렇게 라라 벨의 서비스 컨테이너에 대해 알아보았습니다. :)

 

다음장에는 서비스 프로바이더, 파사드에 대해 알아보도록 하겠습니다. 

+ Recent posts