PSR-2 강제하기

오랜만에 모던 PHP 유저 그룹에서 발표를 했습니다.

희대의 폭망 발표가 됐지만, 그래도 준비한 게 있으니 정리해서 정기모임 발표 자료 저장소에 올려두었습니다.

제목은 PSR-2 강제하기입니다. 표준 스타일을 지키자고 합의를 했다고 해도, 매번 상대방이 코딩 표준을 지켰는지 확인하는 건 번거로운 일이죠. 책을 쓰면서 조사하다보니 코딩 표준을 지키지 않으면 커밋을 못하도록 하는 아주 간단한 방법이 있어서 소개해봤습니다.

PSR-2 강제하기

 

[참고자료]

Enforce code standards with composer, git hooks, and phpcs

ORM 좋네요 좋아

Eloquent ORM을 이용하여 아래의 데이터를 조회하기 위한 코드를 작성했습니다.

  • A가 가진 모든 B들과
  • 그 B들이 가진 모든 C들 중 A와 관련 있는 것만 추린 것들과
  • 그 C들이 가진 모든 D들

그 결과 아래와 같은 코드가 나왔어요. ORM에 익숙한 분들은 이게 뭐? 하시겠지만 저는 굉장히 놀랬습니다 하하. 새삼 ORM에 더 익숙해지면 정말 편리해지겠구나 하는 생각이 드네요.

 

$a = A::find($id);

$a->load([
    'b',
    'b.c' => function($query) use ($a)
        {
            $query->where('a_id', $a->id);
        },
    'b.c.d'
]);

return $a;

 

+
‘b’, 가 없어도 똑같이 동작하네요!

 

leaderboard-728x90

 

Laravel 마이그레이션 작성시 index 존재 여부 확인하는 방법

Laravel에 테이블이나 컬럼이 존재하는지 확인하는 메소드는 있는데 index 존재 여부를 확인하는 메소드는 지원하지 않아서 다소 아쉬운 면이 있었습니다. 찾아보니 doctrine schema manager 를 사용하면 확인이 가능하더군요. Laravel로 마이그레이션 작성해보신 분들은 아래 예제 코드 보시면 바로 이해가 되실거에요. 아마 doctrine/dbal 패키지를 설치가 필요할 거에요.(확인해보진 않았습니다 ^^ 어차피 renameColumn 하려면 필요하니까 걍 설치 고고)

Schema::table('articles', function($table)
{
    $conn = Schema::getConnection();
    $dbSchemaManager = $conn->getDoctrineSchemaManager();
    $doctrineTable = $dbSchemaManager->listTableDetails('articles');

    if($doctrineTable->hasIndex('title')){
        $table->dropIndex('title');
    }
});

 

leaderboard-728x90

 

Laravel 컨트롤러 테스트 작성 요령

테스트를 작성할 때 무엇을 테스트 할 것인지를 결정하는 것이 참 어려운 것 같습니다. Jeffrey Way 의 조언을 따르니 컨트롤러 테스트 작성에 꽤 도움이 되네요.

“Controller tests should verify responses, ensure that the correct database access methods are triggered, and assert that the appropriate instance variables are sent to the view.”

다음에서 발췌: JeffreyWay. ‘Laravel Testing Decoded.’ iBooks.

  1.  response 를 확인한다.
    1. $this->assertResponseIsOk() 혹은 $this->assertRedirectedTo(‘/PATH’) 등으로 확인할 수 있습니다.
  2. 원하는 모델의 메소드가 작동되었는지 확인한다.
    1. Mockery 의 shouldReceive 로 확인할 수 있습니다.
  3. 뷰에 데이터를 잘 넘겼는지 확인한다.
    1. $this->assertViewHas(‘변수명’) 으로 확인할 수 있습니다.

leaderboard-728x90

 

Laravel 테스트 작성중 POST로 리퀘스트 전송시 응답으로 200이 아닌 500이 온다면

csrf 토큰 때문입니다.

app/Http/Middleware/VerifyCsrfToken.php 를

public function handle($request, Closure $next)
{
    if ('testing' !== app()->environment()){
        return parent::handle($request, $next);
    }

    return $next($request);
}

이렇게 수정해서 test 환경에서는 토큰을 확인하지 않도록 해주는 방법이 있습니다.

다른 더 좋은 방법들도 있을거 같아요. 좀 찾아봐야겠습니다. ㅎㅎ
 

leaderboard-728x90

 

MAMP 3.1로 업데이트 이후 Codeception 실행시 PDO 생성이 안되는 경우

엊그제까지만 해도 멀쩡히 동작하던 Codeception이 갑자기 PDO 생성이 안된다는 예외를 발생시키더군요.

[CodeceptionExceptionModule]
  (Exception in Db) SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) while creating PDO connection

원인은 MAMP 업데이트 였는데, 아마도 MAMP가 업데이트 되면서 기본값으로 Mysql에 네트워크 접속을 허용하지 않았기 때문인 것으로 보입니다.

스크린샷 2015-04-05 13.20.49

해결책은 두가지로 보이는데요 하나는 MAMP에 네트워크 접속을 허용해주는 것이고 다른 하나는 Codeception에서 unix_socket 으로 접속을 하는 것입니다. MAMP는 기본적으로 네트워크 접속 허용을 비추천하는 것 같아 Codeception 설정을 바꾸는 방식으로 해결했습니다.

스크린샷 2015-04-05 13.25.17

Composer 인스톨시 Discard changes 를 자동으로 처리하는 방법

배포를 자동화하려면 composer install도 자동으로 완료되어야 합니다.
composer install 을 하다보면 자주는 아니지만 가끔씩 discard-changes 에 대해 어떻게 처리를 할지 입력하도록 요구 받는데요, 이때 값을 입력해주지 않으면 더이상 패키지가 업데이트가 진행이 되지 않습니다.

discard-changes 가 발생해도 배포가 정상적으로 이뤄질 수 있도록 하기 위해서는 아래와 같이 composer.json에 discard-changes 옵션을 넣어주시면 됩니다.

{
    "config": {
        "discard-changes": true
    },
    "require": {
        "monolog/monolog": "1.11.*@dev"
    }
}