[Slim] Slim + Twig 웹페이지 템플릿 > Web/PHP/API

본문 바로가기
사이트 내 전체검색

Web/PHP/API

[Slim] Slim + Twig 웹페이지 템플릿

페이지 정보

작성자 sbLAB 댓글 0건 조회 1,949회 작성일 23-07-01 21:19

본문

 Slim4 + Twig 최신버전 설치 세팅 

Using version ^4.11 for slim/slim 

Using version ^3.3 for slim/twig-view


※최신 버전 설치를 위해 기존 프로젝트(백업 후 작업)의 Slim4 vendor 폴더 삭제 


b44272ded966a52cf073bda3d43aff7c_1688213731_1974.jpg
 

# 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

b44272ded966a52cf073bda3d43aff7c_1688215571_766.jpg

...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);
                }
        }
    }

 


웹접속

b44272ded966a52cf073bda3d43aff7c_1688216155_3423.jpg
 
[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 


댓글목록

등록된 댓글이 없습니다.

회원로그인

접속자집계

오늘
233
어제
401
최대
1,279
전체
221,887

그누보드5
Copyright © sebom.com All rights reserved.