[CakePHP] MVC 프레임워크 Cake를 설치하는 방법


Study/PHP  2019. 10. 1. 10:41

안녕하세요. 명월입니다.


이 글은 PHP에서 MVC 프레임워크 Cake를 설치하는 방법에 대한 글입니다.


지금까지 PHP에 대해 소개한 글들은 오늘 이 글을 작성하기 위한 준비 작업이라고 할 수 있습니다.

Cake는 Java에서의 Spring과 C#에서의 MVC 프레임 워크 같은 MVC모델을 구성하기 위한 프레임워크입니다.

링크 - https://cakephp.org


많은 사람들이 PHP를 사용하면서 Cake 프레임워크를 사용하는게 쉽다고 하는데, 개인적으로는 Java나 C# 프레임워크에 적응이 되어 있어서인가 꽤 복잡합니다.

사실 이 글을 작성하면서도 상당히 헤맸습니다. 일단 설치를 하고 Hello world를 브라우져에 내보내는 목표로 시작하겠습니다.


먼저 Cake를 사용하기 위해서는 몇가지 모듈을 extension해야 합니다. php.ini을 확인합니다.

위 3가지 모듈이 주석이 해제되어 있는지 확인해야 합니다.

주석이 해제되어 있으면 composer로 cake를 다운로드 받습니다.

링크 - [PHP] Composer를 설치 및 사용 방법

composer create-project --prefer-dist cakephp/app

저는 이미 한번 다운로드를 받은 상태라 Loading from cache라고 나오네요. 처음하시는 분이라면 관계 라이브러리를 전부 다운로드 할 것입니다.

폴더로 가보면 하위 app폴더로 다운로드가 이루어져 있습니다. 저는 root에서 작업할 생각이기 때문에 app 하위 폴더의 데이터를 전부 root폴더로 이동합니다.

그리고 .github 폴더와 app폴더는 필요없으니 삭제합니다.

그리고 Cake 자체 내에도 템플릿이 있기는 하지만 말이 템플릿이지 그냥 php소스이므로 smarty를 다운받아서 사용합시다.

composer.json의 require에 smarty 라이브러리를 추가합니다.

링크 - [PHP] PHP 코딩 영역과 HTML 디자인 영역을 분리 시키는 라이브러리 Smarty

그리고 다시 composer update를 합니다.

이제 Cake를 사용하기 위한 준비는 완료되었습니다. 사용하기 전에 간단한 구조적 설명과 초기 수정이 필요합니다.

먼저 폴더를 보면 주로 사용하는 폴더로는 config폴더가 있고 src폴더가 있고 webroot폴더가 있습니다.

config 폴더는 PHP내에서 사용되는 설정파일이 여기에 보관됩니다. 예를 들면 route설정과 데이터 베이스 접속 설정등이 말입니다.

src폴더는 Controller와 Model 소스, View 소스가 여기에 설정됩니다.

webroot폴더는 브라우저에서 참조하는 이미지, 자바스크립트 소스가 여기에 보이게 됩니다. 웹 브라우저의 root는 여기 webroot폴더가 되는 것이고 그 상위 폴더는 보이지 않습니다.


먼저 config폴더의 routes.php파일을 살펴보겠습니다.

여기는 페이지 요청이 되면 어떤 클래스 파일을 호출할 것인지 설정하는 곳입니다.

초기 설정은 Controller는 Pages이고 Action은 display로 되어 있습니다. 즉, src폴더의 Controller폴더의 PagesController 클래스가 불리고 display함수가 호출될 것입니다.

위 소스가 되곘네요. connect클래스에서 정규식으로 설정이 가능하긴 하는데 controller와 action 설정이 애매해 지네요.

그래서 저는 아래와 같이 수정합니다.

...
$URL = $_SERVER["REQUEST_URI"];
if(strpos($URL,"?") > -1) {
  $URL = substr($URL,0,strpos($URL,"?"));
}
$router = explode ("/", $URL);
$controller = "";
$action = "";
if(count($router) < 3){
  $action = "index";
} else {
  $action = $router[2];
  unset($router[2]);
}

if(count($router) < 2 || trim($router[1]) === ""){
  $controller = "Home";
} else {
  $controller = $router[1];
  unset($router[1]);
}

$routes->connect('*', ['controller' => $controller, 'action' => $action]);
...

기존에 있던 connect함수를 호출하는 곳은 주석 처리 했습니다. 위 소스는 $_SERVER로 부터 요청 url를 받아서 그 url 패턴에 따라 Controller와 Action을 호출하는 부분을 바꾸었습니다.

즉, / (루트)의 경우는 HomeController의 index함수가 호출되겠네요. 만약 /Test/Data가 호출이 되면 TestController의 Data함수가 호출될 것입니다. 이는 C#의 MVC프레임워크처럼 맞추었습니다.


예제 Cake에는 HomeController 클래스가 없으니 생성하겠습니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(...$path){
    $this->set('data', "hello world");
  }
}

위 소스는 view로 data의 key값으로 hello world의 값을 보내겠다는 뜻입니다. 예전 Smarty에서 썻던 방식이랑 비슷한 것 같습니다.


이번에는 view를 만등러야 하는데 Cake의 템플릿가 아닌 Smarty 템플릿을 사용하기 때문에 기존 설정을 좀 바꾸어야 합니다.

View의 AppView.php를 수정해야 합니다.

<?php
namespace App\View;

use Cake\View\View;
use Cake\Network\Request;
use Cake\Network\Response;
use Cake\Event\EventManager;

use \Smarty;

class AppView extends View
{
  public function initialize()
  {
  }
  
  protected $_smarty = null;
  public function __construct(Request $request = null, Response $response = null, EventManager $eventManager = null, array $viewOptions = []) {
    // Smarty 설정 부분
    $this->_smarty = new Smarty();
    $this->_smarty->compile_dir = $_SERVER ["DOCUMENT_ROOT"].'/Smarty/templates_c';
    $this->_smarty->cache_dir = $_SERVER ["DOCUMENT_ROOT"].'/Smarty/cache';
    $this->_smarty->config_dir = $_SERVER ["DOCUMENT_ROOT"]. '/Smarty/configs';
    $this->_smarty->error_reporting = 'E_ALL & ~E_NOTICE';
    $this->_smarty->debugging = true;
    $this->_smarty->caching = 0;
    $this->_smarty->clearCompiledTemplate();
    
    parent::__construct($request, $response, $eventManager, $viewOptions);
  }
  
  protected function _evaluate($viewFile, $dataForView) {
    // Controller에서 view를 호출할 때 데이터를 넘기기 위한 부분.
    foreach ($dataForView as $key => $val) {
      $this->_smarty->assign($key, $val);
    }
    $this->_smarty->assignByRef('this', $this);
    // 에러가 발생하면 Smarty가 아닌 Cake Template를 사용한다.
    if(@$dataForView["error"] !== null){
      return parent::_evaluate($viewFile, $dataForView);
    }
    return $this->_smarty->fetch($viewFile);
  }
}

이클립스에서 에러 메시지가 뜨기는 하지만 문제가 있는 소스는 아니니 깔끔하게 무시합니다.

이제 controller에서 view를 넘기는 부분을 만들었으면 view를 작성합니다.


view소스는 Template 폴더 안에 있습니다. 일단 그대로 사용하면 100%에러가 발생하는데 이는 Cake template는 php처럼 작성이 되어 있어서 그렇습니다.

먼저 Layout폴더의 default.ctp 소스를 수정합니다.

<!DOCTYPE html>
<html>
<head>
	<title>Example</title>
</head>
<body>
    {$this->Flash->render()}
    <div class="container clearfix">
        {$this->fetch('content')}
    </div>
    <footer>
    </footer>
</body>
</html>

이 Layout은 C#에서 마스터 Layout 파일과 비슷한 것으로 Default Layout 설정입니다.

현재 Home폴더의 index.ctp파일이 없으므로 생성하고 Controller에서 넘긴 data값을 표시하도록 합니다.

이제야 Cake초기 설정과 기본 페이지 작성이 완료되었네요.

Hello world가 잘 찍혀 나왔습니다. 참고로 제가 다른 Url로 접근을 해 보겠습니다.

제가 /Test로 접속을 하니 TestController 클래스가 없다고 에러가 나오네요.

Cake의 설치와 기본 페이지 작성을 했습니다. 이제부터 하나하나 부분적으로 분석해서 뜯어 봐야겠습니다.


참조 - https://github.com/yukikikuchi/cakephp3-smartyview


여기까지 PHP에서 MVC 프레임워크 Cake를 설치하는 방법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.