[Slim] Slim + Twig 웹페이지 템플릿
작성일 23-07-01 21:19
페이지 정보
작성자sbLAB 조회 2,040회 댓글 0건본문
Slim4 + Twig 최신버전 설치 세팅
- Using version ^4.11 for slim/slim
- Using version ^3.3 for slim/twig-view
※최신 버전 설치를 위해 기존 프로젝트(백업 후 작업)의 Slim4 vendor 폴더 삭제
# composer require slim/slim
-----------------------------
Using version ^4.11 for slim/slim
------------------------------
# composer require slim/twig-view
----------------------------------
Using version ^3.3 for slim/twig-view
----------------------------------
2. [기타 프로젝트 필수 라이브러리 설치]
composer require php-di/slim-bridge
composer require slim/http
composer require nyholm/psr7
composer require nyholm/psr7-server
composer require firebase/php-jwt
3. 프로젝트 composer.json 파일 확인
[autoload 경로 확인] - 프로젝트명(프로젝트 네임스페이스 최상단)을 Slim 이나 App 아닌 Asite 처럼 고유단어 사용
(slim 프레임워크 라이브러리의 내의 Slim 과 App 네임스페이스와 구분 어려움)
.../vendor/composer/autoload_psr4.php
.../vendor/composer/autoload_static.php
{
"require": {
"slim/slim": "^4.11",
"slim/twig-view": "^3.3",
"php-di/slim-bridge": "^3.4",
"nyholm/psr7": "^1.8",
"nyholm/psr7-server": "^1.0",
"firebase/php-jwt": "^6.8"
},
"autoload": {
"psr-4": {
"Asite\\": "Asite"
}
}
}
# composer update 실행하여 원하는 설정과 다르게 변경되는지 확인
[버전 업데이트 확인]
D:\....\htdocs\slimapi> composer update
Slim4 + Twig 적용 예
주의
윈도우와 다르게 리눅스는 대소문자 구분한다.(클래스명과 파일명은 대소문자 항상 일치하도록 함) <- PHP autoloading..
예) 페이지 컨트롤러 클래스 명이 $app->get('/pall',Slim\Pages\TwigSelectAllPage::class); 이라면,
컨트롤러 구현 php 파일도 대소문자 구분하여 Slim\Pages\TwigSelectAllPage.php 파일 명을 사용해야 함.
- public 폴더 아래 templates 폴더 생성, templates 아래 cache 폴더 생성
- twig 템플릿 파일 생성 => selectall.html.twig
...public/templates/selectall.html.twig
<head>
<link rel="stylesheet" href="templates/selectall.css">
</head>
<ol style="--length: 5" role="list">
{% set color = 1 %}
{% for member in members %}
{% if member.id == 140 %}
{% set color = 5 %}
{% else %}
{% set color = 1 %}
{% endif %}
<li style="--i: {{ color }}">
<h3>{{ member.id}}</h3>
<p>{{ member.email }}</p>
<p>{{ member.email }}</p>
</li>
{% endfor %}
</ol>
[selectall.css 파일 참조 링크]
Slim4 index.php
// [■ Twig] Set view in Container - DI컨테이너에 Twig 등록 => 'view'
$container->set('view', function() {
//public 폴더아래 templates 폴더 생성, templates 아래 cache 폴더생성
//cache 폴더에 템플릿 html 캐시파일 생성됨(캐시 끄려면 아래처럼 false)
//return Twig::create('templates', ['cache' => 'templates/cache']);
return Twig::create('templates', ['cache' => false]);
});
// 1) Instantiate the app
$app = AppFactory::create();
// [■ Twig] Add Twig-View Middleware - Slim4 미들웨어에 Twig 추가
$app->add(TwigMiddleware::createFromContainer($app));
.....
$routes_page = require __DIR__ . '/../routes/routes_page.php';
$routes_page($app);
Slim4 routes/routes_page.php
<?php
/**
* routes_page.php
*/
use Slim\App;
return function (App $app) {
//-------------- twig -----------------
// TwigSelectAllPage.php 대소문자 일치하도록 파일 명 사용!
$app->get('/pall', Asite\Pages\TwigSelectAllPage::class);
};
Slim4 Slim/Pages/TwigSelectAllPage.php (DB member 테이블 select)
<?php
declare(strict_types=1);
namespace Asite\Pages;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use PDO, PDOException;
use Psr\Container\ContainerInterface;
final class TwigSelectAllPage
{
//container ...config\di.php
private $container;
//__construct
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function __invoke(Request $request, Response $response, $args): Response
{
$db_pdo=$this->container->get('DB_PDO_MAIN');
$twig_view=$this->container->get('view');
try {
$sql = "SELECT * FROM members";
$dbconnect = $db_pdo;
$stmt = $dbconnect->query($sql);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$dbconnect = null;
// render selectall.html + members array
return $twig_view->render($response, 'selectall.html.twig', [
'members' => $result
]);
} catch (PDOException $ex) {
$error = array(
'result' => false,
"msg" => $ex->getMessage()
);
$response->getBody()->write(json_encode($error));
return $response
->withHeader('content-type', 'application/json')
->withStatus(500);
}
}
}
웹접속
[nginx 보안 설정]
- 웹서버에서 *.twig 템플릿 파일 웹 접근 차단.
/etc/nginx/nginx.conf
#deny *.twig extension
location ~\.(ini|log|conf|twig)$ {
deny all;
return 403;
}
- 기타 업로드폴더(uploads) 권한
chown nginx:nginx uploads
chmod 700 uploads
- Slim4 웹사이트 MVC 개발 가능(가벼움/빠름/템플릿 html 페이지 캐싱 가능)
- 데이타모델(Model/Data Class) + View페이지(Twig템플릿) + 컨트롤러(invoke -> Controller Class / autoload / DI / Route / DB)
[참조 사이트]
- 샘플 html/css
- Slim Framework Twig View
댓글목록
등록된 댓글이 없습니다.