백엔드 서비스가 필요한데 spring boot 로 구현하면 시간이 걸릴것 같아 php 로 정말 간단한 restful api 구현할려고 합니다. mac 에 개발환경을 구축하고 사이트에 올려서 정상적으로 서비스 되는부분 까지 정리해 보겠습니다.
1. 설치순서
아래와 같은 순서 되로 설치 진행하겠습니다.
php 설치 (7.4 version) :::tip php 7.4 글을 쓰는 시점에 8.x php 가 있어 이를 설치 했지만 slim framework 설치시 문제가 발생한 관계로 8.x 를 삭제하고 7.4 버전 으로 다운 그레이드 해서 다시 설치 했습니다. slim framework 을 이용 하실려는 분들은 참고 하시기 바랍니다. :::
composer 설치
slim 설치
apache 설치
apache 설정
2. php 설치
@7.4 버전을 명시 하여 7.4 버전 으로 설치해 주세요.
1
brew install php@7.4
3. composer 설치
composer 는 의존성 관리 도구 입니다. 자바의 maven 이나 gradle npm 같은 거라고 보시면 되겠 네요 이것도 설치 간단 합니다. 아래 명령어 입력 하면 끝..
1
brew install composer
4. slim framework 설치
아래 명령어 는 phprest 디렉토리 에 slim framework 를 설치하겠다는 의미 입니다. 명령어 입력하고 기다리면 디렉토를 알아서 만들고 필요한 파일도 모두 다운로드 받습니다. 참쉽네요.
위에 까지 일반적인 설정이였다면 이부분이 중요 합니다. 위에서 slim 프레임워크를 phprest 란 디렉토리에 설치를 했습니다. 이디렉토리 아래에 public 이란 디렉토리가 생성되었을 거에요 public 디렉토를 DocumentRoot로 잡아주세요 그리고 directory부분도 경로를 맞춰 주세요.
DocumentRoot "/Users/goodsaem/goodsaem/phprest/public" <Directory "/Users/goodsaem/goodsaem/phprest/public"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.4/mod/core.html#options # for more information. # Options Indexes FollowSymLinks
# # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # AllowOverride All
# # Controls who can get stuff from this server. # Require all granted </Directory>
index.php 가 디렉토리의 인덱스가 되도록 아래와 같이 설정하고 확장자가 php이면 php 로 인식할 수 있도록 아래와 같이 설정 합니다.
use App\Application\Settings\SettingsInterface; use DI\ContainerBuilder; use Monolog\Handler\StreamHandler; use Monolog\Logger; use Monolog\Processor\UidProcessor; use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface;
return function (ContainerBuilder $containerBuilder) { $containerBuilder->addDefinitions([ LoggerInterface::class => function (ContainerInterface $c) { $settings = $c->get(SettingsInterface::class);
$loggerSettings = $settings->get('logger'); $logger = new Logger($loggerSettings['name']);
$processor = new UidProcessor(); $logger->pushProcessor($processor);
$handler = new StreamHandler($loggerSettings['path'], $loggerSettings['level']); $logger->pushHandler($handler);
use App\Application\Actions\User\ListUsersAction; use App\Application\Actions\User\ViewUserAction; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\App; use Slim\Interfaces\RouteCollectorProxyInterface as Group;
return function (App $app) { $app->options('/{routes:.*}', function (Request $request, Response $response) { // CORS Pre-Flight OPTIONS Request Handler return $response; });