0. 개요
라라벨에서는 php artisan을 이용해서 기본적인 명령어를 실행할 수 있습니다.
익숙한 걸로 Controller 생성과 Model 생성이 있죠.
라라벨은 직접 php artisan 명령어를 만들 수 있도록 지원합니다.
이번 포스팅에서는 명령어로만 아래 기능을 수행할 수 있는 프로젝트를 만들어봅시다.
- 신규 멤버 직접 추가하기 및 무작위로 추가하기
- 멤버 리스트 보기
- 특정 멤버가 있는지 확인하기
- 특정 멤버를 제외하기
- 멤버 중에서 랜덤으로 한 명 추첨하기
1. 프로젝트 세팅 및 파일 생성
Laravel 9버전으로 프로젝트를 만들어 주고 각각의 라라벨 세팅이 맞춰 설정해줍시다.
composer create-project laravel/laravel laravel_cli "9.*"
cd laravel_cli
composer install
mysql 접속
create database laravel_cli;
vi .env 수정
php artisan make:model Member -m
php artisan migrate
php artisna command는 다음과 같은 형식으로 만들 수 있습니다.
앞서서 개요에서 말한 기능에 맞춰 5개를 생성해줍시다.
php artisan make:command InsertMember
php artisan make:command CheckMember
php artisan make:command DrawMember
php artisan make:command ListMember
php artisan make:command RemoveMember
2. 테이블 수정
만들어진 migrations 파일을 수정해줍시다.
database/migrations/yyyy_mm_dd_000000_create_members_table.php
...
public function up()
{
Schema::create('members', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->timestamps();
});
}
...
Member 모델도 수정합시다.
App/Models/Member.php
class Member extends Model
{
use HasFactory;
// Name 컬럼을 저장할 수 있게 합시다.
protected $fillable = ['name'];
}
3. 서비스 클래스 생성
기존에는 주된 비즈니스 로직을 컨트롤러에 넣었습니다.
하지만 프로젝트가 커지면 컨트롤러가 아닌 별도의 서비스 클래스로 관리하는 경우가 많습니다.
(개발자의 역량에 따라 많은 종류의 패턴이 존재)
저는 위와 같은 부분과 더불어 이번 프로젝트에 경우 컨트롤러 클래스가 필요가 없기에 서비스 클래스로 구현할 것입니다.
다음 클래스가 대부분의 기능을 포함합니다.
App\Services\MemberService.php
<?php
namespace App\Services;
use App\Models\Member;
use Illuminate\Support\Arr;
class MemberService
{
private Member $member;
public function __construct(Member $member){
$this->member = $member;
}
/**
* 임의로 멤버로를 추가하거나, 랜덤으로 멤버를 추가합니다.
* @param $name
* @return string
*/
public function insert($name = null){
if (isset($name)) {
$this->member->create(['name' => $name]);
} else {
$name = fake()->name();
$this->member->create(['name' => $name]);
}
return $name;
}
/**
* 멤버 리스트(ID, 이름)를 가져옵니다, 옵션에 따라 이름만 가져올 수 있습니다.
* @param $option
* @return array
*/
public function list($option = null){
if(isset($option) && $option == 'name'){
return $this->member->orderBy('id')->pluck('name')->toArray();
}
return $this->member->orderBy('id')->select(['id', 'name'])->get()->toArray();
}
/**
* 파라미터로 넘어온 이름을 가진 멤버가 있는 지 확인합니다.
* @param $name
* @return bool
*/
public function check($name){
return $this->member->where("name", $name)->first() !== null;
}
/**
* 현재 저장된 멤버 중에서 무작위 한명을 추첨합니다.
* @return string
*/
public function draw(){
return Arr::random($this->member->pluck('name')->toArray());
}
/**
* 선택한 이름을 가진 멤버를 삭제합니다.
* @param $name
* @return bool
*/
public function remove($name){
return $this->member->where(['name' => $name])->delete();
}
}
4. 커맨드 클래스 작성
이제 선언했던 Command 클래스들을 수정해줍시다.
저는 생성된 5가지 Command 클래스들을 App\Console\Commands\Member 디렉토리 안으로 넣었습니다.
이 부분 참고하시고 작성해주시기 바랍니다.
CheckMember.php
App\Console\Commands\Member\CheckMember.php
서비스 클래스에서 선언한 메소드인 check 를 사용합니다.
아래에 보시면 $signature 변수에 member:check {name}을 사용한 것을 확인하실 수 있습니다.
이 부분은 php artisan 명령어 뒤에 올 부분이며 {name}은 입력 값입니다.
그러므로 이 명령어는 php artisan member:check 이름값까지 입력해야 합니다.
또한 cli에서 문장을 띄울 때는 handle 메소드에서 $this->info를 사용하시면 됩니다.
<?php
namespace App\Console\Commands\Member;
use App\Services\MemberService;
use Illuminate\Console\Command;
class CheckMember extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'member:check {name}';
/**
* The console command description.
*
* @var string
*/
protected $description = '입력한 멤버가 있는 지 확인합니다.';
/**
* Execute the console command.
*
* @return int
*/
public function handle(MemberService $memberService)
{
$name = $this->argument('name');
$this->info($memberService->check($name) ? "\"$name\"은 존재합니다." : "\"$name\"은 존재하지 않습니다.");
return Command::SUCCESS;
}
}
아래처럼 사용이 가능합니다.
DrawMember.php
App\Console\Commands\Member\DrawMember.php
서비스 클래스에서 선언한 메소드인 draw를 사용합니다.
이 명령어는 $signature에서 옵션을 입력하지 않게 정의하였습니다.
<?php
namespace App\Console\Commands\Member;
use App\Services\MemberService;
use Illuminate\Console\Command;
class DrawMember extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'member:draw';
/**
* The console command description.
*
* @var string
*/
protected $description = '멤버를 추첨합니다.';
/**
* Execute the console command.
*
* @return int
*/
public function handle(MemberService $memberService)
{
$this->info("\"".$memberService->draw()."\"가 당첨되었습니다.");
return Command::SUCCESS;
}
}
아래와 같은 결과를 확인할 수 있습니다.
$signature 변수 말고도 $description 변수에 넣은 문자 값은 --help 옵션을 통해 확인할 수 있습니다.
--help 옵션으로 설명문뿐만 아니라 사용 방법 및 옵션도 알 수 있습니다.
InsertMember.php
App\Console\Commands\Member\InsertMember.php
서비스 클래스에서 선언한 메소드인 Insert를 사용합니다.
{name?} 형식으로 $signature에 넣었습니다, 이는 옵션을 의미하여 name을 입력하지 않아도 됩니다.
<?php
namespace App\Console\Commands\Member;
use App\Services\MemberService;
use Illuminate\Console\Command;
class InsertMember extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'member:insert {name?}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Member 테이블에 신규 멤버를 추가합니다.';
/**
* Execute the console command.
*
* @return int
*/
public function handle(MemberService $memberService)
{
$name = $this->argument('name');
$this->info("\"".$memberService->insert($name)."\"이 추가되었습니다.");
return Command::SUCCESS;
}
}
아래와 같은 결과를 확인할 수 있습니다.
결과처럼 필수로 입력을 입력하지 않아도 됩니다.
ListMember.php
App\Console\Commands\Member\ListMember.php
서비스 클래스에서 선언한 메소드인 list를 사용합니다
$this->table를 통해 테이블 형태로 데이터를 출력할 수도 있습니다.
<?php
namespace App\Console\Commands\Member;
use App\Services\MemberService;
use Illuminate\Console\Command;
class ListMember extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'member:list';
/**
* The console command description.
*
* @var string
*/
protected $description = '전체 멤버를 출력합니다.';
/**
* Execute the console command.
*
* @return int
*/
public function handle(MemberService $memberService)
{
$this->table(
['ID', 'Name'],
$memberService->list()
);
return Command::SUCCESS;
}
}
아래와 같은 결과를 확인할 수 있습니다.
RemoveMember.php
App\Console\Commands\Member\RemoveMember.php
서비스 클래스에서 선언한 메소드인 remove를 사용합니다.
$this->choice를 통해 값을 선택할 수 있습니다. 선택한 값이 리턴되어 그 값을 통해 처리할 수 있습니다.
<?php
namespace App\Console\Commands\Member;
use App\Services\MemberService;
use Illuminate\Console\Command;
class RemoveMember extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'member:remove';
/**
* The console command description.
*
* @var string
*/
protected $description = '전체 멤버 중 원하는 멤버를 삭제합니다.';
/**
* Execute the console command.
*
* @return int
*/
public function handle(MemberService $memberService)
{
$memberList = $memberService->list('name');
$removeName = $this->choice(
'누굴 삭제하겠습니까?',
$memberList
);
$this->info($memberService->remove($removeName) ? "\"$removeName\"를 지웠습니다." : "\"$removeName\"을 지우는데 실패했습니다..");
return Command::SUCCESS;
}
}
아래와 같은 결과를 확인할 수 있습니다.
5. 예제 실행
아래 주소에서 전체 코드 확인이 가능합니다.
https://github.com/DSeung001/Blog/tree/master/laravel_cli
놓치거나 실수에 대한 피드백 해주시면 매우 감사합니다.
명령어 기능을 사용하여 데이터베이스 자동 백업 기능도 포스팅했습니다.
'PHP > Laravel' 카테고리의 다른 글
[Laravel9] 쉽게 라라벨 DI, IOC 이해하기 (0) | 2023.02.16 |
---|---|
[Laravel9] 라라벨 DB 백업 명령어 만들기 및 자동화 with Artisan console (0) | 2022.11.01 |
[Laravel9] 라라벨 테스팅 만들기 with Trait, Factory (0) | 2022.10.28 |
[Laravel9] 라라벨 이메일 보내기 with Google SMTP, Markdown (0) | 2022.10.24 |
Laravel 9 Observer 써보자, 옵저버로 이력(히스토리) 쌓기 (0) | 2022.09.23 |