C 익스텐션으로 개발된 풀스택 PHP 프레임워크

팔콘은 혁신적인 아키텍처를 가진 현존하는 가장 빠른 PHP 프레임워크입니다!

C를 몰라도 개발자들은 Phalcon을 사용할 수 있습니다. 함수들은 Phalcon 네임스페이스 상의 PHP클래스와 인터페이스로 노출되어 있어, 즉시 사용가능합니다.
특징
  • 낮은 오버헤드
  • 객체관계매핑(ORM)
  • PHQL
  • 트랜잭션
  • 캐쉬
  • 뷰 & 프론트엔드
  • 템플릿 엔진
  • 템플릿 엔진(Volt)
  • i18n
  • 폼 빌더
  • 플래시 메시지

  • 낮은 오버헤드
    전통적인 프레임워크들에 비해 적은 메모리와 CPU를 소모합니다
  • MVC & HMVC
    모듈, 컴포넌트, 모델, 뷰 그리고 컨트롤러
  • 의존성 주입
    의존성 주입과 서비스 위치는 그 자체로 컨테이너가 됩니다.
  • Rest
    이 경우 당신의 목적에 따라 마이크로 어플리케이션이나 풀스택 어플리케이션을 선택하여 사용할 수 있습니다. 또한 강력한 HTTP 헬퍼들이 있습니다.
  • Autoloader
    PSR-4를 따르는 PHP 클래스 오토로딩 메카니즘을 제공합니다.
  • 라우터
    Phalcon\Mvc\Router는 고급 라우팅 기능을 제공합니다.
낮은 오버헤드
PHP C-익스텐션 (Phalcon)
  • Zephir/C 익스텐션은 웹서버의 데몬 시작 과정에서 PHP와 함께 최초 단 한번 로드 됩니다.
  • 익스텐션에서 제공되는 클래스와 함수는 어떤 어플리케이션에서나 사용가능합니다.
  • Phalcon의 코드는 이미 특정 플랫폼과 프로세서에 맞추어 컴파일 되었기 때문에 인터프리팅 되지 않습니다.
  • 로우레벨 아키텍처와 최적화 덕분에 Phalcon은 MVC 기반의 어플리케이션에 대해 오버헤드가 최소화 되어있습니다
MVC
쉽고 즐겁게 싱글 & 멀티모듈 어플리케이션을 만드세요. 이미 잘 알고 계신 파일구조, 스키마, 패턴을 이용하시면 됩니다.
                        
single/
    app/
        controllers/
        models/
        views/
    public/
        css/
        img/
        js/

                        
                    
                        
multiple/
     apps/
       frontend/
          controllers/
          models/
          views/
          Module.php
       backend/
          controllers/
          models/
          views/
          Module.php
       public/
       ../
                        
                    
의존성 주입
팔콘은 의존성 주입이라는 강력하지만 이해하고 사용하기 쉬운 패턴 위에 만들어졌습니다. 서비스를 한번 초기화 하거나 정의하면 - 어플리케이션 어디에서나 사용할 수 있습니다.
                        
// 의존성주입 컨테이너 만들기
$di = new Phalcon\DI();

// 클래스, 함수, 컴포넌트 등록
$di->set("request", new Phalcon\Http\Request());

..

// 다른 곳에서 사용하기
$request = $di->getShared('request');
                        
                    
Restful 서비스
REST 서버와 어플리케이션을 작성하는 것이 이것보다 쉬울 순 없습니다. 빈 말이 아닙니다. 간단한 서비스는 하나의 파일에 작성될 수 있습니다.
                        
use Phalcon\Mvc\Micro;

$app = new Micro();

// 데이터를 JSON으로 반환
$app->get(
    '/check/status',
    function () {
        return $this
            ->response
            ->setJsonContent(
                [
                    'status' => 'important',
                ]
            )
        ;
    }
);

$app->handle();
                        
                    
Autoloader
네임스페이스, 접두어, 디렉터리와 클래스를 등록하세요. 오토로더 이벤트를 활용하여 어떤 파일이 어떤 위치에서 로드될지 모두 제어할 수 있습니다.
                        
use Phalcon\Loader;

// Autoloader 생성
$loader = new Loader();

// 네임스페이스를 몇개 등록하세요
$loader->registerNamespaces(
    [
       'Example\Base'    => 'vendor/example/base/',
       'Example\Adapter' => 'vendor/example/adapter/',
       'Example'         => 'vendor/example/',
    ]
);

// Autoloader 등록
$loader->register();
                        
                    
라우터
라우팅을 합니다. 딱 그것만 합니다.
                        
// 라우터 생성
$router = new \Phalcon\Mvc\Router();

// 라우트 정의
$router->add(
   '/admin/users/my-profile',
   [
       'controller' => 'users',
       'action'     => 'profile',
   ]
);
                        
                    
  • 객체관계매핑(ORM)
    객체 관계형 매핑
  • PHQL
    강력하고 안전한 Phalcon 쿼리 언어, PHQL
  • 트랜잭션
    팔콘의 트랜잭션은 데이터 무결성을 안전하게 지킵니다.
  • 캐쉬
    Phalcon이 제공하는 다양한 백엔드 캐시로 성능을 향상시키세요
객체관계매핑(ORM)
팔콘에서 제공하는 강력한 ORM은 데이터베이스 레코드를 클래스와 오브젝트 형태로 조작하는것을 가능하게 해줍니다. MySQL, PostgreSQL, SQLite가 별도의 작업 없이 바로 지원됩니다.
                        
use Invoices;
use Phalcon\Mvc\Model;

class Customers extends Model
{
    public $cst_id;

    public $cst_name;

    public function initialize()
    {
        $this->hasMany(
            'cst_id',
            Invoices::class,
            'inv_cst_id'
        );
    }
}
                        
                    
PHQL
PHQL은 표준 SQL과 비슷한 언어의 쿼리를 작성할 수 있는 고수준의 객체지향 SQL (비표준) 언어입니다. PHQL은 문법을 대상 RDBMS로 변환하는 (C로 작성된) 파서로 구현되어 있습니다. 가능한 최고의 성능을 내기 위해서, Phalcon 에서는 SQLite와 동일한 기술을 사용하는 파서를 제공합니다. 이 기술은 메모리를 적게사용하며 Thread-safe한 작은 인-메모리 파서입니다.
                        
$phql  = 'SELECT * '
       . 'FROM Formula\Cars '
       . 'ORDER BY Formula\Cars.name';
$query = $manager->createQuery($phql);

$phql  = 'SELECT Formula\Cars.name '
       . 'FROM Formula\Cars '
       . 'ORDER BY Formula\Cars.name';
$query = $manager->createQuery($phql);

$phql  = 'SELECT c.name '
       . 'FROM Formula\Cars c '
       . 'ORDER BY c.name';
$query = $manager->createQuery($phql);

$phql = 'SELECT c.* '
      . 'FROM Cars AS c '
      . 'ORDER BY c.name';
$cars = $manager->executeQuery($phql);

foreach ($cars as $car) {
    echo "Name: ", $car->name, "\n";
}
                        
                    
트랜잭션
하나의 프로세스가 여러 데이터베이스 작업을 실행하는 경우, 각 단계가 성공적으로 완료되어 데이터 무결성을 지키는것이 중요할 것입니다. 트랜잭션은 모든 데이터베이스 작업이 커밋되기 전에 성공적으로 실행되었음을 보장하는 기능을 합니다.
                        
use Phalcon\Mvc\Model\Transaction\Failed;
use Phalcon\Mvc\Model\Transaction\Manager;

try {

    // 트랜잭션 관리자 생성
    $manager = new Manager();

    // 트랜잭션 요청
    $transaction = $manager->get();

    // 로봇을 삭제해봅니다
    $invoices = Invoices::find(
        'inv_cst_id = 123'
    );

    foreach ($invoices as $invoice) {
        $invoice->setTransaction($transaction);
        if ($invoice->delete() == false) {
            // 문제가 발생했습니다 - 트랜잭션 롤백
            foreach ($invoice->getMessages() as $message) {
                $transaction
                    ->rollback($message->getMessage());
            }
        }
    }

    // 이상 없음 - 트랜잭션 커밋
    $transaction->commit();

    echo "로봇을 성공적으로 삭제했습니다!";

} catch (Failed $e) {
    echo "실패했습니다, 원인:  ", $e->getMessage();
}
                        
                    
캐쉬
캐시 컴포넌트는 우리가 자주 사용하거나 이미 처리된 데이터에 빠르게 접근하도록 해줍니다. Redis, Memcached, Mongo, Files, Apc 등 다양한 백엔드를 지원합니다.
                        
use Phalcon\Cache;
use Phalcon\Cache\AdapterFactory;
use Phalcon\Storage\Serializer\SerializerFactory;

$serializerFactory = new SerializerFactory();
$adapterFactory    = new AdapterFactory($serializerFactory);

$options = [
    'defaultSerializer' => 'Json',
    'lifetime'          => 7200
];

$adapter = $adapterFactory
    ->newInstance('apcu', $options);

$cache = new Cache($adapter);
                        
                    
  • 템플릿 엔진
    뷰는 어플리케이션의 사용자 인터페이스부분을 나타냅니다
  • 템플릿 엔진(Volt)
    Jinja에 의해 영감을 받았으나 PHP를 위해 C언어로 빌드한 템플릿 엔진
  • i18n
    어플리케이션을 여러 언어로 쉽게 번역하세요
  • 폼 빌더
    HTML 폼 쉽게 생성하기
  • 플래시 메시지
    플래시 메시지는 사용자에게 작업의 상태를 알리는데 사용됩니다.
템플릿 엔진
뷰는 어플리케이션의 사용자 인터페이스를 나타냅니다. 뷰는 종종 데이터의 화면 표시에만 관련된 작업을 수행하는 PHP코드가 삽입된 HTML파일을 의미합니다. 뷰는 웹브라우저 혹은 어플리케이션에서 요청을 보내는 데에 사용되는 다른 도구들에게 데이터를 제공하는 작업을 처리합니다.
                        
<html>
    <body>
    <div class='top'>
        <?php $this->partial('shared/ad_banner'); ?>
    </div>
    <div class='content'>
        <h1>Robots</h1>
        <p>
            Check out our specials for robots:
        </p>
        ...
    </div>
    <div class='footer'>
        <?php $this->partial('shared/footer'); ?>
    </div>
    </body>
</html>
                        
                    
템플릿 엔진(Volt)
Volt는 PHP용 Zephir/C로 작성되어 엄청나게 빠르고 디자이너에게 편리한 템플릿 엔진입니다. Volt는 뷰를 쉽게 작성할 수 있는 헬퍼들을 제공합니다. Volt는 Phalcon의 다른 컴포넌트들과 고수준으로 통합되어 있으며, 단독 컴포넌트로 사용할 수 도 있습니다.
                        
{# app/views/products/show.volt #}
{% block last_products %}
{% for prod in products %}
    * Name: {{ prod.name|e }}
    {% if prod.status == 'Active' %}
       Price: {{ prod.price + prod.taxes/100}}
    {% endif  %}
{% endfor  %}
{% endblock %}
                        
                    
i18n
Phalcon/Translate 컴포넌트는 다국어 어플리케이션을 만드는데 도움을 줍니다. 이 컴포넌트를 사용하는 어플리케이션은 어플리케이션이 지원하는 언어 중 사용자가 선택한 언어에 기반해서 컨텐츠를 다른 언어들로 보여줍니다.
// app/messages/en.php
$messages = [
    'hi'      => 'Hello',
    'bye'     => 'Good Bye',
    'hi-name' => 'Hello %name%',
    'song'    => 'This song is %song%'
];

// app/messages/es.php
$messages = [
    'hi'      => 'Hola',
    'bye'     => 'Adiós',
    'hi-name' => 'Hola %name%',
    'song'    => 'Esta canción es %song%'
];

use Phalcon\Mvc\Controller;
use Phalcon\Translate\Adapter\NativeArray;

// UserController.php
class UserController extends Controller
{
    protected function getTranslation()
    {
        // 브라우저의 최적 언어
        $language = $this
            ->request
            ->getBestLanguage();

        // 언어별 번역 파일을 확인해주세요
        $fileName = 'app/messages/'
                  . $language
                  . '.php';
        if (file_exists($fileName) {
            require $fileName;
        } else {
            // 없다면 기본설정된 언어로 대체
            require 'app/messages/en.php';
        }

        // 번역된 객체를 반환
        return new NativeArray(
            array(
                'content' => $messages
            )
        );
    }

    public function indexAction()
    {
        $this->view->name = 'Mike';

        $this->view->t = $this
            ->getTranslation();
    }
}
// user.volt
<p><?php echo $t->_('hi'), ' ', $name; ?></p>
                        
                    
폼 빌더
폼의 각 요소는 개발자의 필요에 따라 그려질 수 있습니다. 내부적으로 Phalcon\Tag가 각 요소별로 올바른 HTML을 생성하는데 사용되며 render() 함수의 두번째 파라미터로 추가적인 HTML 속성을 전달할 수 있습니다.
                        
use Phalcon\Forms\Form;
use Phalcon\Forms\Element\Text;
use Phalcon\Forms\Element\Select;

$form = new Form();

$form->add(new Text('name'));

$form->add(new Text('telephone'));

$form->add(
    new Select(
        'telephoneType',
        array(
            'H' => 'Home',
            'C' => 'Cellphone'
        )
    )
);
                        
                    
플래시 메시지
플래쉬 알리미를 사용하여 웹어플리케이션에서 사용자에게 알림을 보여주세요:
                        
use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function saveAction()
    {
        $this->flash->error(
            '양식에 오류가 있습니다.'
        );
        $this->flash->success(
            '넵! 다 좋습니다'
        );
        $this->flash->notice(
            '이것은 사용자들을 위한 알림입니다.'
        );
        $this->flash->warning(
            '이건 그냥 경고에요.'
        );
    }
}
                        
                    
  • ACL
    접근제어목록(ACL) 은 사용자들이 접근권한이 있는 모듈에만 접근하도록 허용합니다.
  • 샤딩
    동시에 여러 데이터베이스에 연결하고 데이터를 저장 및 검색할 수 있습니다.
  • 암호화
    인증되지 않은 서드파티들로 부터 중요한 데이터를 안전하게 보호하기 위해 암호화/복호화를 해주세요
  • 이벤트
    '훅 포인트'를 설정해서 프레임워크의 컴포넌트를 확장하세요. 자신만의 이벤트를 만들어서 어플리케이션을 더욱 유연하고 강력하게 만들 수 있습니다.
ACL
접근 제어 목록(ACL)을 만드는 방법입니다.
                        
use Phalcon\Acl;
use Phalcon\Acl\Enum;
use Phalcon\Acl\Role;
use Phalcon\Acl\Adapter\Memory;

// ACL 생성
$acl = new Memory();

// 기본 동작은 접근 "거부"입니다
$acl->setDefaultAction(Enum::DENY);

// 역할을 두개 등록하세요, 사용자
// 그리고 손님
$roles = array(
    'users'  => new Role('Users'),
    'guests' => new Role('Guests')
);

foreach ($roles as $role) {
    $acl->addRole($role);
}
                        
                    
샤딩
모델을 다른 데이터베이스에 연결
                        
use Phalcon\Db\Adapter\Pdo\Mysql;
use Phalcon\Db\Adapter\Pdo\PostgreSQL;

// 이 서비스는 MySQL 데이터베이스를 반환합니다.
$container->set(
    'dbMysql',
    function () {
        return new Mysql(
            [
                'host'     => 'localhost',
                'username' => 'root',
                'password' => 'secret',
                'dbname'   => 'tutorial',
            ]
        );
    }
);

// 이 서비스는 PostgreSQL 데이터베이스를 반환합니다.
$container->set(
    'dbPostgres',
    function () {
        return new PostgreSQL(
            [
                'host'     => 'localhost',
                'username' => 'postgres',
                'password' => '',
                'dbname'   => 'invo',
            ]
        );
    }
);
                        
                    
암호화
Phalcon은 Phalcon\Crypt 컴포넌트를 통해 암호화 기능을 제공합니다. 이 클래스는 PHP의 openssl 암호화 라이브러리에 대한 심플한 객체지향 래퍼를 제공합니다.
                        
use Phalcon\Crypt;

$crypt = new Crypt();

$key  = '이것은 암호화 키 입니다(32바이트).';
$text = '암호화하려는 텍스트.';

$encrypted = $crypt->encrypt($text, $key);

echo $crypt->decrypt($encrypted, $key);
                        
                    
이벤트 관리
EventsManager(이벤트관리자) 를 이용하면 특정한 타입의 이벤트를 리스너에 등록할 수 있습니다. 이제 'dispatch' 이벤트에 대해 알아봅시다. 아래의 코드는 Dispatcher에 의해 생성된 모든 이벤트를 필터링합니다:
                        
use Phalcon\Mvc\Dispatcher;
use Phalcon\Events\Manager;

$container->set(
    'dispatcher',
    function () {
        // 이벤트관리자 생성
        $manager = new Manager();

        // 다음에서 만들어진 이벤트를 감지
        // 보안플러그인(SecurityPlugin) 을 사용한 디스패쳐(dispatcher)
        $manager->attach(
            'dispatch:beforeExecuteRoute',
            new SecurityPlugin
        );

        // 예외와 찾을수없음(not-found) 처리
        // noutFoundPlugin을 이용한 예외(exceptions)
        $manager->attach(
            'dispatch:beforeException',
            new NotFoundPlugin
        );

        $dispatcher = new Dispatcher();

        // 다음에 이벤트 관리자를 지정:
        // 디스패쳐
        $dispatcher
            ->setEventsManager($manager);

        return $dispatcher;
    }
);
                        
                    
A polling app built from scratch in < 15 min
데모 비디오 보기
우리의 활기찬 개발자 커뮤니티에 가입하세요!
익스텐션, 플러그인, 어댑터, VM, 예제, 소스코드 등에 대한 커뮤니티의 기여
Phalcon 기여자
Phalcon은 놀라운 커뮤니티 덕분에 하루하루 더 좋아지고 있습니다
기여