[laravel] GuLa library

소개

GuL(a)ibrary (이하 구라블러리 ㅎ)는 sir.kr에서 만든 그누보드와 영카트의 테이블의 모델들을 묶어둔 라이브러리입니다.
바로 DB를 바꿀순 없고 api, scheduler등 더 다양한 기능들을 기존 그누보드, 영카트를 유지하면서 laravel로 구현하기 위해 만들어졌습니다.

실은 그누보드로 만들어진 사이트 서로 연동 하는 작업하는데 raw php론 너무 힘들어서 만들엇습니다. ㅎ

특징

구라블러리는 그누보드와 Laravel에서 사용할 DB를 따로 분리하여 운영이 가능합니다.
구라브러리는 Laravel의 relation을 그누보드 DB에서 사용할수 있습니다.
구라브러리는 G5ModelFactory를 통해 모델이 존재하지 않는 경우 runtime상에서 인스턴스 생성이 가능합니다.
구라브러리는 그누보드에서 생성된 g5_write_ 테이블을 G5Member 모델을 통해 자동으로 연결해줍니다,

모두 구랍니다

설치

composer require silnex/gula

.env

GULA_DB_HOST=gnuboard.db.host
GULA_DB_PORT=3306 # (default: 3306)
GULA_DB_DATABASE=gnuboard_db
GULA_DB_USERNAME=gnuboard_db_user
GULA_DB_PASSWORD=gnuboard_db_pass
GULA_CHARSET=utf8mb4 # DB 문자셋 (default: utf8mb4)
GULA_COLLATION=utf8mb4_unicode_ci # DB 문자셋 (default: utf8mb4_unicode_ci)

위처럼 env를 설정하여 그누보드와 Laravel의 DB를 각각 운영하실 수 있습니다.

예제

<?php
// 그누보드
use SilNex\GuLa\Models\Gnu\G5Member;
$g5Member = new G5Member;
$g5Member->all();
$g5Member->where('mb_id', '=', 'admin');

// 영카트
use SilNex\GuLa\Models\Young\G5ShopItem;
$g5ShopItem = new G5ShopItem;
$g5ShopItem->all();

관계-Relationships

Laravel을 쓰면서 가장 마음에 들었엇고 또 가장 많이 사용하는 Relation도 넣었습니다.
다만 그누보드는 외래키가 따로 존재하지않고 mb_id 등 AI를 이용한 검색도 하지 않아 직접(…) 각각의 모델에 넣어줬습니다.

한땀한땀….
<?php
use SilNex\GuLa\Models\Gnu\G5Member;
$g5Member = new G5Member;

$admin = $g5Member->where('mb_id', '=', 'admin')->first();
$admin->g5Points()->get();

위에 구현을 통해 계정을 가져온 다음 계정의 포인트를 가져오는 식의 활용이 가능합니다.

G5ModelFactory

그누보드는 게시판에 따라 각각 테이블을 만드는데 이때 만들어진 테이블을 아래의 커스텀 모델로 만들어 사용할 수도 있지만, 코드상으로 factory를 통해 생성할 수 있습니다.

<?php
// Anywhere

use SilNex\GuLa\G5ModelFactory;

// ['connection', 'table_name']
$G5WriteFree = new G5ModelFactory(['gula', 'g5_write_free']);
$G5WriteFree->get();

그누보드 게시판 자동연동

구라이브러리는 그누보드에서 생성되는 g5_write_로 시작하는 게시판 테이블을 G5Member 모델을 통해서 자동으로 연동해줍니다.

<?php
use SilNex\GuLa\Models\Gnu\G5Member;

var_dump(class_exists("\SilNex\GuLa\Gnu\G5WriteFree")); // bool(false)

$g5Member = new G5Member;
$admin = $g5Member->where('mb_id', '=', 'admin')->first();
$admin->g5WriteFree()->first(); // g5_write_free의 mb_id가 admin인 게시글을 가져온다.

커스텀 모델

만약 직접 만드신 테이블 혹은 PG사의 테이블 처럼 이후에 추가되는 경우 직접 추가 하실 수 있습니다.

<?php
// App/CustomG5Model.php

namespace App;

use SilNex\GuLa\G5Model;

class CustomG5Table extends G5Model
{
    protected $table = 'custom_g5_table';

    // code here
}

커멘드 (개발중)

아직 개발중이긴 하지만 artisan 커맨드를 통해 쉽게 G5모델을 만들수 있게 개발중입니다.
대략적인 사용방법은 아래와 같습니다.

php artisan g5model:write free # app/G5Models/G5WriteFree.php 생성
php artisan g5model:pg # PG와 관련된 모델 생성


버그/아이디어 제보

직접 프로젝트에 사용하면서 만들다보니 제가 미처 테스트 못하는 부분은 Github 이슈를 통해서 제보해주시면 감사하겠습니다!

Laravel Validate fail custom message

Laravel에선 Vaildator 혹은 FormReqeust를 이용해 사용자의 입력값을 검증 할 수 있다.
또한 각 조건 별로 에러 표시되는 에러 메시지를 설정할 수 있는데 해당 부분은 coustom-error-message 을 참고하도록 하자.

TL;DR

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

trait UsesCustomErrorMessage
{
    /**
   * Handle a failed validation attempt.
   *
   * @param  \Illuminate\Contracts\Validation\Validator  $validator
   * @return void
   *
   * @throws \Illuminate\Http\Exceptions\HttpResponseException
   */
    protected function failedValidation(Validator $validator)
    {
        $message = (method_exists($this, 'message')) ? $this->container->call([$this, 'message']) : __('validation.error_message');

        throw new HttpResponseException(
            response()
                ->json([
                    'errors' => $validator->errors(),
                    'message' => $message,
                ], 422)
        );
    }
}

이 포스트의 목적은 커스텀 에러 메시지가 아니고,
Laravel 5.5이후 부터 입력값 검증에 실패할 경우 아래와 같은 형식으로 에러가 표시되는데,

{
    "message": "The given data was invalid.",
    "errors": {
        "field-1": [
            "Error 1",
            "Error 2"
        ],
        "field-2": [
            "Error 1",
            "Error 2"
        ],
    }
}

"message": "The given data was invalid"는 FormReqeust의 messages()resources/lang/xx/validation.php에서는 커스텀이 되지 않아 저 부분을 수정하는 방법에 대해서 말하고자 한다.

위에 에러 메시지를 커스텀 하는 방법은 failedValidation 메소드를 사용해 커스텀 할 수 있다.

protected function failedValidation(Validator $validator)
{
    $message = (method_exists($this, 'message')) ? $this->container->call([$this, 'message']) : '커스텀 에러 메시지';

    throw new HttpResponseException(
        response()
            ->json([
                'errors' => $validator->errors(),
                'message' => $message,
            ], 422)
    );
}

이 코드를 FormRequset마다 넣어주면 좋겠지만, 코드가 복잡해지니 helper에 trait 로 선언해두고 use 를 사용해 필요한 곳에 넣어 주면 사용하기 편리하다.

App/helper.php

namespace App\Helpers;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

trait UsesCustomErrorMessage
{
    protected function failedValidation(Validator $validator)
    {
        $message = (method_exists($this, 'message')) ? $this->container->call([$this, 'message']) : __('validation.error_message');

        throw new HttpResponseException(
            response()
                ->json([
                    'errors' => $validator->errors(),
                    'message' => $message,
                ], 422)
        );
    }
}

App/Http/requests/storePost.php (FormRequest)

namespace App\Http\Requests;

class storePost extends FormRequest
{
    use UsesCustomErrorMessage;

    ...
}

서버 네트워크 에러,,

6월 11일
네트워크 문제로 인한 서버 다운

6월 12일
일정상 접근이 불가능해 다운된상태로 유지.

6월 13일
서버 정상화 작업 및 복구용 포트 생성 & 서버 대여폭 확대 & silnex@silnex.kr 메일 인증 강화 (gmail naver 스팸 해제)

블로그 접속 불량

어제 (5월 4일)부터 오늘 (5월 5일) 까지 접속이 불가능했습니다.

이유인 즉슨 갑자기 IP가 변동 되어서 그렇습니다.
여지껏 10년 넘깨 바뀌지 않은 IP가 갑자기 바뀌다니;; 아마 주변에서 공사하며 무슨 일이 있었던것 같습니다..

이번 기회로 DDNS를 적용할 예정이니 앞으로 이번과 같은 접속 불량은 없을 것 같습니다.

Move blog to SilNex.kr

기존 silnex.kro.kr에서 더 빠르고,
도메인도 간단한silnex.kr로 이전했습니다.


Todo
silnex.kr style 커스텀
silnex.kro.kr 블로그 글 옮기기
글 표시시 요약글로 표시
kro.kr 자동 리다이렉트