윈도우 컴포저 패키지 설치시 오류 처리 방법

Your requirements could not be resolved to an installable set of packages.

1
2
3
4
5
6
7
Your requirements could not be resolved to an installable set of packages.

Problem 1
- laravel/horizon v4.2.1 requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
- laravel/horizon v4.2.0 requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
- laravel/horizon 4.x-dev requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
- Installation request for laravel/horizon ^4.2 -> satisfiable by laravel/horizon[4.x-dev, v4.2.0, v4.2.1].

Laravel Horizon을 windows에서 설치하려 할 때 위와 같은 오류가 발생하였습니다.

해결방안

pcntl은 윈도우에서 지원이 되지 않으므로 Docker 또는 Vargrant와 같은 가상환경을 사용해야 합니다.
Link

또는 아래와 같이 실행하여 설치를 완료 할 수 있습니다.

1
composer require laravel/horizon --ignore-platform-reqs

--ignore-platform-reqs 옵션의 설명은
해당 링크에서 확인할 수 있습니다. Link

1
ignore php, hhvm, lib-* and ext-* requirements and force the installation even if the local machine does not fulfill these. See also the platform config option.

패키지를 설치하는데 필요한 조건을 충족하지 못하더라도 무시하고 설치를 실행하는 옵션입니다.

필요 조건을 모두 충족하지 않은 경우이므로 정상동작에 실패 할 수 있습니다.

[PHP] InvalidArgumentException : Unable to locate factory with name [default]

발단

Laravel Framework로 TDD를 진행중에 Unit Test를 하기 위해 artisan 콘솔을 이용하여 TaskTest 라는 이름의 테스트 클래스를 생성하였습니다.

1
$ php artisan make:test TaskTest --unit

코드는 간단했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

namespace Tests\Unit;

use App\Project;
use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\TestCase;

class TaskTest extends TestCase
{
use RefreshDatabase;

/**
* @test
*/
public function it_belongs_to_a_project()
{
$task = factory('App\Task')->create();
$this->assertInstanceOf(Project::class, $task->project);
}
}

해당 테스트를 생성 후 아래와 같이 PHPUnit으로 해당 테스트를 실행하였더니

1
$ ./vendor/bin/phpunit --filter it_belongs_to_a_project

아래 이미지와 같은 에러가 나왔습니다.

InvalidArgumentException : Unable to locate factory with name [default] [App\Task]

과연 무엇이 문제일까 싶어 해당 모델의 migration이 제대로 안된걸까요?

자세히 보기

PHPUnit Annotation 정리

서론


PHP Unit을 사용하면서도 잘 모르는 어노테이션을 PHPUnit v8.4 기준(2019-11-19 최신버전)으로 정리하였습니다.

@author

테스트를 작성자별 그룹화 필터링 할 때


@group 어노테이션의 별칭으로, 테스트를 작성자별로 그룹화하여 필터링 하는데 사용할 수 있습니다.

@after

각 테스트가 끝난 뒤 실행 하려 할 때


각 테스트 메소드들이 실행 된 후, 특정 메소드를 실행하고자 할때 사용할 수 있습니다.

각 테스트가 끝난 뒤 트랜잭션 커밋or롤백을 한다거나, 생성된 파일을 삭제하는 등의 처리를 하는데 사용하면 좋을 것 같습니다.

예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

namespace Tests;

use PHPUnit\Framework\TestCase;

class MyTest extends TestCase
{
/**
* @after
*/
public function afterDo()
{
echo "After Method Called" . PHP_EOL;
}

public function test1()
{
echo "test1 Method Called" . PHP_EOL;
self::assertTrue(true);
}

public function test2()
{
echo "test2 Method Called" . PHP_EOL;
self::assertTrue(true);
}
}

// 출력 결과
test1 Method Called
After Method Called
test2 Method Called
After Method Called
자세히 보기

[PHP]Monolog와 함께 로그를 시작하자 - 1

PHP에서 로그 남기기

PHP에서는 주로 JS에서 console.log | console.debug 와 유사하게

var_dump | print_r | echo | sys_log | error_log 등 다양한 방식으로 로그를 남기고 있습니다.

Monolog란?

PSR-3을 준수하고 있는 로깅 프레임워크로,

거의 대부분의 로깅 플랫폼과 연결할 수 있는 핸들러(Slack, ElasticSearch, Mail, NewRelic 등)를 제공하고 있습니다.

RFC 5424(Syslog Protocol이라고 하는데 더 공부해봐야할 것 같습니다.)에 정의된 로그 레벨을 모두 지원하고 있습니다.

  • DEBUG(100)
  • INFO(200)
  • NOTICE(250)
  • WARNING(300)
  • ERROR(400)
  • CRITICAL(500)
  • ALERT(550)
  • EMERGENCY(600)
자세히 보기

[Laravel]with() | has() | whereHas() 뭐가 다를까

ORM도 익숙하지 않지만, Eloquent ORM은 처음 접해보면서,

쿼리빌더를 사용하는것은 ORM스럽지 못하다 느껴 최대한 ORM으로 풀고 싶었습니다

검색으로 알아보던중 Eloquent:Relations에 대해 알게되었습니다.

라라벨 공식 문서 : 관계의 존재 여부 쿼리 질의하기

예를들어 User가 여러개의 Post 를 가지고 있다면,

User 클래스에 $this->hasMany('App\Post');를 설정해 두었을 것이라는 가정하에 설명을 진행하도록 하겠습니다.

자세히 보기

[PHP] PHP4.x 버전과 PHP 5.x 버전 비교(Comparison between PHP4 and PHP5)

PHP5에서 무엇이 바뀌었을까?

  • 젠드엔진2가 내장되었습니다.
  • PHP GCI 버전이 php.exe 에서 php-cgi.exe 로 변경되었습니다.
  • PHP CLI 버전이 cli/php.exe 에서 주 디렉토리로 변경되었습니다.
  • PHP CLI 버전은 php.ini 지시어 설정과 상관없이 항상 전역 $argv(Array of arguments passed to script) 와 $argc(The number of arguments passed to script) 변수를 가지며, register_argc_argv(argv와 argc 변수를 선언할지 여부 설정)를 off로 설정해도 영향을 미치지 않습니다.
자세히 보기

[PHP] 에러 보여주기

배포 서버에서는 권장하지 않는 설정입니다.
테스트 서버에서 에러 메세지를 확인하고 싶을때
해당 php 파일의 최상위나 공통파일의 최상위에 이 소스코드를 넣어주시면 됩니다.
1
2
3
4
<?php
error_reporting(E_ALL); //모든 PHP 에러를 리포팅함
ini_set("display_errors", 1); //php.ini 파일의 'display_errors'를 활성화 시킴
?>

[PHP]삼항 연산자

삼항연산자(?:)는 조건식 ? 참일때 실행할로직 : 거짓일때 실행할 로직; 과 같이쓴다. (if-else를 짧게 줄인것)

a 변수값이 있는지 검사한후 값이 있으면 foo값을 반환, 없으면 bar라는 값을 반환

ex)

1
2
3
4
5
<?php
$a = 'foo';
$b = $a ?: 'bar';
echo $b; // foo
?>