https://laravel.com/docs/6.0/releases

 

Release Notes - Laravel - The PHP Framework For Web Artisans

 

laravel.com

이번(2019년 9월 3일)에 Laravel LTS 버전 6.0이 공개되었습니다.

 

현재는 번역되지 않은 페이지 밖에 없지만 추후 생길 것 같고,

5.x버전에서 6.0버전으로 업그레이드 되면서 많은 변화는 없어 보입니다.

추가된 기능이나, 좀더 편해진 기능을 한번 살펴본다면,

이전버전에서 부터 사용하시던 분들이라면, 문제없이 바로 사용할수 있을것 같습니다.

 

버그수정은  21년 9월 3일

보안수정은 22년 9월 3일

까지 이루어진다고 합니다.

 

 

 

 

라라 벨 브로드캐스팅에 대해 알아보겠습니다.

라라 벨 브로드캐스팅이란, 서버에 데이터가 변경되면 메시지가 웹 소캣 연결로 보내져 클라이언트에 의해 처리될 수 있도록 합니다. 

바로 테스트를 해보도록 하겠습니다.

테스트는 모든 클라이언트에 대해 메시지를 송신하는 쪽으로 만들었습니다.

만들어 보는것

위와 같은 작업을 수행합니다.

  • 1) laravel서버 쪽에서 이벤트를 발생시켜, 레이디스 서버에 6379 포트를 이용하여 데이터를 전달합니다.
  • 2) laravel-echo-server와 redis의 SUB/PUB는 항상 연결되어있는 상태로 만들어줍니다. 

    • 혹시 redis의 SUB/PUB를 모르시는 분은 먼저 개념을 잡아오시는 게 좋을 듯합니다.
  • 3) 클라이언트와 laravel-echo-server는 websocket를 이용하여 항상 연결되어있는 상태로 만들어줍니다.
    • 1번에서 데이터를 넘겨주었을 때를 라라 벨에코서버는 SUB를 이용하여 데이터를 받아옵니다. 그후 받은 데이터를 클라이언트화면에 뿌려줍니다.
사전작업

redis서버

nodeJs

laravel프레임워크

 

라이브러리 설치
npm install --save laravel-echo socket.io-client
composer require predis/predis
laravel-echo-server설치
npm install -g laravel-echo-server

라라 벨 에코 서버를 설치합니다.

참고로 라라벨 에코서버를 이용할 때는 redis서버가 반드시 필요하기 때문에 사전작업의 redis서버를 준비해 주세요

 

 

그 후 라라벨 에코 서버 json파일을 작성해줍니다.

laravel-echo-server init
? Do you want to run this server in development mode? Yes
? Which port would you like to serve from? 6001
? Which database would you like to use to store presence channel members? redis
? Enter the host of your Laravel authentication server. http://localhost:8000
? Will you be serving on http or https? http
? Do you want to generate a client ID/Key for HTTP API? Yes
? Do you want to setup cross domain access to the API? Yes
? Specify the URI that may access the API: http://localhost:8000
? Enter the HTTP methods that are allowed for CORS: GET, POST
? Enter the HTTP headers that are allowed for CORS: Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Autho
rization, X-CSRF-TOKEN, X-Socket-Id
? What do you want this config to be saved as? laravel-echo-server.json
appId: fb9e72802cace662
key: 9bf6eb178b5601e2353d387c9d46531b

init을 이용하면 위와 같이 설정을 할 수 있습니다.

 

마지막으로 라라벨 에코 서버를(laravel-echo-server start) 기동시 킵니다.

$laravel-echo-server start

L A R A V E L  E C H O  S E R V E R

version 1.5.3

Starting server...

✔  Running at localhost on port 6001
✔  Listening for http events...
✔  Listening for redis events...

Server ready!

혹시 아래와 같은 에러가 보인다면 redis서버가 준비되어있지 않은 상태이니 한번 확인해주세요!

[ioredis] Unhandled error event: Error: connect ECONNREFUSED 127.0.0.1:6379
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)

 

 

라라벨 쪽 작업

1. config/app.php 코드 수정

App\Providers\BroadcastServiceProvider::class,

프로바이더 쪽에 위의 코드를 추가시켜주세요

 

2.. env파일 변경

BROADCAST_DRIVER=log로 되어있는 곳을

BROADCAST_DRIVER=redis

redis로 변경해주세요

 

서버 쪽 작업

전체 송신 기능용으로 작성하겠습니다.

 

1. Event관련 함수 작성

php artisan make:event PublicEvent

artisan커멘드를 이용하여 작성합니다.

 

2. app/Events/PublicEvent.php 파일 수정

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class PublicEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        // redis채널이름 
        return new Channel('public-event');
    }

    public function broadcastWith()
    {
      return [
        "message" => "hello world",
      ];
    }
}

위와 같이 코드를 변경해주세요.

 

3. route/web.php 코드 수정

어떤 이벤트가 발생해야 브로드캐스트가 가능하므로, 이벤트를 작성합니다.

이번 경우는 어떤 url로 접속했을 때 반응하는 브로드캐스트입니다.

Route::get('/public-event', function(){
	broadcast(new \App\Events\PublicEvent())
	return "return값은 없어도 상관없음.";
});

return 값은 없어도 상관없지만 화면에 아무것도 찍히지 않으면 헷갈리니까 넣어봤습니다.

 

클라이언트 쪽 작업

1. resources/js/bootstrap.js 코드 수정

//for Echo
import Echo from 'laravel-echo';
window.io = require('socket.io-client');

// 접속정보
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: 'http://localhost:6001',
});

// redis채널설정
window.Echo.channel('laravel_database_public-event')
    .listen('PublicEvent', (e) => {
        console.log(e);
    });

위의 코드를 추가해주세요.

자세히는 모르겠지만, 저 같은 경우는 laravel_database_뒤에 채널 이름이 만들어졌습니다...

redis 로그를 이용하여 어떤 채널이 만들어졌는지 확인해주세요....

 

2. laravelMix이용

npm install
npm run dev

laravel Mix를 이용하여 public/js/app.js에 수정한 코드를 추가시켰습니다.

 

 

3. blade페이지 수정

저 같은 경우는 resources/views/welcome.blade.php 파일을 수정하였습니다.

<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="{{ asset('js/app.js')}}"></script>

위의 두 코드를 추가합니다.

 

 

확인 작업

localhost:8000/public-event 화면과

localhost:8000의 화면을 동시에 켜놓고

public-event화면을 새로고침 하면 아래와 같은 hello world가 출력되는 것을 볼 수 있습니다.

 

'IT' 카테고리의 다른 글

[laravel] Laravel 6.0 LTS  (0) 2019.09.04
PHP - 제너레이터  (0) 2019.06.03
인터페이스&추상클래스  (0) 2019.05.16
HTTP헤더 인젝션  (0) 2019.05.15
[laravel 기초공부] 라라벨 - 06 (뷰 블레이드- 기본)  (0) 2019.05.13

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

뷰는 디폴트로 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 요청을 강제로 보내도록 하는 것이다. 이것은 공격자가 취약한 애플리케이션이 피해자로부터의 정당한 요청이라고 오해할 수 있는 요청들을 강제로 만들 수 있다.

 

 

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

 

서비스 프로바이더의 역할은 서비스컨테이너에 바인딩을 등록하는 역할을 합니다.
프로바이더는 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