⚡️ A PHP GraphQL Framework

Overview

Railt

Testing PHP 7.4+ railt.org Discord Latest Stable Version Total Downloads License MIT

Introduction

Project idea is clean and high-quality code. Unlike most (all at the moment) implementations, like webonyx, youshido or digitalonline the Railt contains a completely own implementation of the GraphQL SDL parser which is based on EBNF-like grammar. This opportunity allows not only to have the original implementation of the language and to keep it always up to date, but also to implement a new backward compatible functionality that is not available to other implementations.

Goal of Railt:

  • Do not repeat the mistakes made in the JS-based implementations.
  • Implement a modern and convenient environment for PHP developers.
  • Implement easy integration into any ready-made solutions based on PSR.
  • Provide familiar functionality (including dependency injection, routing, etc.).

Installation

  • composer require railt/railt

// TBD

Quick start

The documentation is in the process of writing, therefore, in order to understand how it works, a quick start.

// TBD

Learning Railt

This documentation can contain NOT RELEVANT information and currently in progress.

Contributing

Thank you for considering contributing to the Railt Framework! The contribution guide can be found in the documentation.

Code Contributors

This project exists thanks to all the people who contribute. [Contribute].

Financial Contributors

Become a financial contributor and help us sustain our community. [Contribute]

Individuals

Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]

Security Vulnerabilities

If you discover a security vulnerability within Railt, please send an e-mail to maintainer at [email protected]. All security vulnerabilities will be promptly addressed.

License

The Railt Framework is open-sourced software licensed under the MIT license.

FOSSA Status

Help & Community Discord

Join our Discord community if you run into issues or have questions. We love talking to you!

Supported By

JetBrains

Comments
  • Roadmap Oct'17 - Dec'17

    Roadmap Oct'17 - Dec'17

    Reflection

    • [x] Merge railt/parser and railt/reflection into single package.
    • [x] Remove railt/support package.
    • [x] Release alpha 1 (composer require railt/compiler 0.0.1)
    • [x] Fix and improve arguments LSP (Reflection).
    • [x] To get rid of checks of a status of the builder and to take out in validation from the outside (visitor?).
    • [x] Remove "extend" from visible types and make preprocessing kernel (required for future additional features like #21 ).
    • [x] Exceptions improvement: https://github.com/railt/railt/issues/23
    • [x] Add type verifications.
    • [x] Types inheritance bugfixes.
    • [x] ~Waiting for https://github.com/hoaproject/Compiler/pull/76~
    • [x] ~Waiting for https://github.com/hoaproject/Compiler/pull/79~
    • [x] ~Waiting for a new release of hoa/compiler~ (forked into: https://github.com/railt/parser)
    • [x] Release 1.0

    Webonyx builder

    • [x] Implement the base Webonyx support
    • [x] Add support of Field Type
    • [x] Add support of Argument Type
    • [x] Add support of SchemaType
    • [x] Add support of Object Type
    • [x] Add support of Interface Type
    • [x] ~Add support of Union Type~
    • [x] Add support of Directive Type
    • [x] Add support of Scalar Type
    • [x] ~Add support of Enum Type~
    • [x] ~Add support of Input Type~
    • [x] Add type invocations base hooks support

    Jan'18 →

    TODO 
    opened by SerafimArts 8
  • Multiple graphql files and schema extender modularization feature

    Multiple graphql files and schema extender modularization feature

    Is possible to add a feature that i can write multiple graphql files and combine than in a one?

    Example:

    UserSchema.graphqls

    type Query{
       users: User[]
    }
    type User{
      name: String
      login: String
      email: String
      role: Role
    }
    

    RoleSchema.graphqls

    type Query{
       roles: Role[]
    }
    type Role{
      name: String
      level: Int
    }
    

    And the root schema: schema.graphqls

    schema{
       query: Query
    }
    

    The result schema should be:

    schema{
       query: Query
    }
    type Query{
       roles: Role[]
       users: User[]
    }
    type User{
      name: String
      login: String
      email: String
      role: Role
    }
    type Role{
      name: String
      level: Int
    }
    

    Or, maybe using directives:

    schema{
       query: Query
    }
    @import(schema: "UserSchema.graphqls")
    @import(schema: "RoleSchema.graphqls")
    

    In this webonyx issue https://github.com/webonyx/graphql-php/issues/180#issuecomment-444478026 there are something like that, maybe is a way to start.

    This will be nice for a huge number of types and queries.

    Thanks.

    Help Wanted 
    opened by mihazs 7
  • [DISCUSSION] How to add a new directive or a extension?

    [DISCUSSION] How to add a new directive or a extension?

    Hello, i'm very excited about this project.

    I'm trying to integrate this on phalcon framework, and what i'm trying to do is to create a directive to handle user authorizations. My idea is similar to the solution made to laravel integration, found in this repository https://github.com/SerafimArts/railt-authorization, but this don't solve my problem, because i'm not using laravel.

    I know that the docs are not made yet, but, can you give a example of how to do this? I'm using the 1.3.5 version of railt. Is there a way to just add a directive using directly the Application class? And how the extensions works??

    I'm trying to avoid to do that in controller classes because this will be a very repetitive task and it's not a elegant solution.

    Help Wanted 
    opened by mihazs 7
  • [Question] Access parent attributes from route

    [Question] Access parent attributes from route

    I want to use the route directive to solve custom type fields, using the root type, for example:

    type Query{
     usuario: [Usuario]
       @route(action: "UserController@list")
    }
    
    
    type Role {
        _key: ID!
        nome: String
    }
    
    type User {
        _key: ID!
        nome: String
        login: String
        email: String
        role: Role  
            @route(action: "RoleController@roleByUserId")
    }
    

    and

    class RoleController{
     public function roleByUserId($parent){ //argument $parent can access all the parent data
      $userId = $parent['_key']
    
      //return the role of the user
     }
    }
    

    In other words, i want a way to pass a parameter to the controller, and his value will be the same as the field of the type in which the @route directive is declared.

    This will be very useful, because we don't need to solve the type "Role" each time that the type "User" are used, for example.

    In webonyx we have something like this:

    <?php
    use GraphQL\Type\Definition\ObjectType;
    use GraphQL\Type\Definition\Type;
    $queryType = new ObjectType([
        'name' => 'Query',
        'fields' => [
            'echo' => [
                'type' => Type::string(),
                'args' => [
                    'message' => Type::nonNull(Type::string()),
                ],
                'resolve' => function ($root, $args) {
                    return $root['prefix'] . $args['message'];
                }
            ],
        ],
    ]);
    

    The key of the question is that part:

    'resolve' => function ($root, $args) {
                    return $root['prefix'] . $args['message'];
                }
    

    the $root variable, this is what a want.

    It's there a way to do that, maybe using extensions??

    Help Wanted 
    opened by mihazs 6
  • Railt Compiler 1.3 regression

    Railt Compiler 1.3 regression

    railt/compiler 1.3 seems to have a regression that does not allow me to read some pp2 files.

    Expected Behavior

    The following is my pp2 file. It parses correctly under railt/compiler 1.2.1:

    // MijnArchief Query Language definition
    
    %skip space \s+
    
    // Scalars
    %token true     TRUE|true
    %token false    FALSE|false
    %token null     NULL|null
    %token date     (\d{4}-\d{2}-\d{2})(?:T(\d{2}:\d{2}))?
    %token number   \d+
    %token dstring  "([^"]*)"
    %token sstring  '([^']*)'
    
    // Comparisons
    %token eq   =
    %token neq  !=
    %token gt   >
    %token lt   <
    %token gte  >=
    %token lte  <=
    
    // Logic
    %token and     AND|and
    %token or      OR|or
    %token not     NOT|not
    
    // Grouping
    %token brace_  \(
    %token _brace  \)
    
    // Fields
    %token field    \w+
    
    #conditionalOr -> Prezent\Infrastructure\Query\AST\ConditionalOr:
        conditionalAnd() ( ::or:: conditionalAnd() )*
    
    #conditionalAnd -> Prezent\Infrastructure\Query\AST\ConditionalAnd:
        simpleExpression() ( ::and:: simpleExpression() )*
    
    simpleExpression:
        filter() | negation() | group()
    
    #negation -> Prezent\Infrastructure\Query\AST\Negation:
        ::not:: simpleExpression()
    
    group:
        ::brace_:: conditionalOr() ::_brace::
    
    #filter -> Prezent\Infrastructure\Query\AST\Filter:
        <field> comparisonOperator() scalar()
    
    #comparisonOperator -> Prezent\Infrastructure\Query\AST\ComparisonOperator:
        <eq> | <neq> | <gt> | <lt> | <gte> | <lte>
    
    #scalar -> Prezent\Infrastructure\Query\AST\Scalar:
        <true> | <false> | <null> | <date> | <number> | <dstring> | <sstring>
    

    What happens instead?

    I get the following exception using railt/compiler 1.3.0:

    Error while Railt\Compiler\Grammar\Delegate\TokenDelegate initialization: Argument 1 passed to Railt\Parser\Ast\Rule::__construct() must be of the type string, object given, called in /opt/www/sites/sander/mijnarchief/vendor/railt/parser/src/Parser/Ast/Builder.php on line 160

    Description

    The problem is that my pp2 file uses delegates. In line 160 it calls new $delegate($rule). But, the delegate class extends Railt\Parser\Ast\Rule (as suggested in your documentation) and it's constructor does not work here.

    Note that the delegate constructor is not part of the RuleInterface or LeafInterface!

    Steps To Reproduce

    Parse the pp2 using railt/compiler 1.3

    Environment

    • Railt Version: 1.3
    • PHP Version: 7.2
    Bug Compatibility 
    opened by sandermarechal 5
  • Slow Parser

    Slow Parser

    It is required to find out the reason for the slow work of the parser because In this embodiment, it cannot be used parse requests (GraphQL Queries).

    Benchmarks

    100 iterations per query Example { field } query.

    Railt 1.4.x-dev

    use Railt\Io\File;
    use Railt\GraphQL\Frontend\Parser;
    
    $parser = new Parser();
    
    for ($i = 0; $i < $count; $i++) {
        $parser->parse(File::fromSources('query Example { field }'));
    }
    

    Result: 0.7785s (100%)

    Webonyx 0.13.0

    Link: https://github.com/webonyx/graphql-php

    use GraphQL\Language\Source;
    use GraphQL\Language\Parser;
    
    for ($i = 0; $i < $count; $i++) {
        Parser::parse(new Source('query Example { field }'));
    }
    

    Result: 0.0363s (+2144%)

    Improvement 
    opened by SerafimArts 4
  • Routing improvements

    Routing improvements

    Divide the routing component into two component parts:

    • Routing
    • Decorators

    Routing

    The route must return complete data for the response, including all available relations.

    Definitions

    The following methods should be implemented:

    • ->query('name', '...'): Must respond to query requests.
    • ->mutation('name', '...'): Must respond to mutation requests.
    • ->subscription('name', '...'): Must respond to subscription requests.
    • ->on('name', '...'): Must respond to all requests.

    The second argument is a router handler (callable or string definition ClassName@action).

    The action should provide complete information about the:

    • Relations
    • Arguments
    • Field type
    • ...other

    Example:

    schema {
        query: Query
    }
    
    type Query {
        users: [User]!
    }
    
    type User {
        id: ID!
        name: String!
        friends: [User]!
        createdAt: DateTime!
    }
    
    $router->query('users', function (Input $input) {
        $query = new DatabaseBuilder();
    
        if ($input->hasRelation('friends')) {
            $query->leftJoin(...);
        }
        
        return $query->get();
    });
    

    Decorators

    The decorators system should provide the ability to manage and format already generated data. A class must implement at least three methods:

    Middleware

    Definition ->middleware('name', '...'). The first argument contains the name and group of the middlevare, the second is the response handler. The nesting group is separated by a "dot" (.) symbol. To use this decoration system - it must be declared in routs explicitly.

    Example:

    // Definition
    $decorators->middleware('example', function ($input, $output) { ... });
    
    // Usage the "example" middleware
    $router->on('users', function (...) { ... })->middleware('example');
    

    Example with groups:

    // Definition
    $decorators->middleware('group-example.test1', function ($input, $output) { ... });
    $decorators->middleware('group-example.test2', function ($input, $output) { ... });
    $decorators->middleware('group-example', function ($input, $output) { ... });
    
    // Usage of "group-example", "group-example.test1" and "group-example.test2" middleware
    $router->on('users', function (...) { ... })->middleware('group-example'); 
    

    Path

    The definition of "path decorators" should point explicitly to the field in the query inheritance chain (the collection indexes should not be taken into account when compiling the path).

    Example

    // Processing the field "createdAt" for the GraphQL query: "{ users { friends { createdAt } }"
    $decorators->path('users.friends.createdAt', function (...) { ... });
    

    Type-hint

    "Type-hint" decorators must respond to the type matching in the declaration and the return result (using the instanceof operator).

    Example:

    // Processing the all fields which return a type that is one of the `DateTimeInterface` children.
    $decorator->type(\DateTimeInterface::class, function (...) { ... });
    
    Proposition 
    opened by SerafimArts 4
  • Fix the composer provide rule for railt/container

    Fix the composer provide rule for railt/container

    This package does not provide the code of the psr/container package (which defines interfaces). It provides psr/container-implementation which is the virtual package representing implementations of the interface. Providing the wrong package while also requiring it creates issues with Composer 2, because the solver will consider that installing psr/container is not necessary as it is already provided.

    Refs composer/composer#9316

    opened by stof 3
  • Simple documentation

    Simple documentation

    Hello,

    We are currently choosing GraphQL library for our project and railt looks really promising. Its well written and modern, but English documentation is rally missing !

    We dont need perfect documentation which covers every single detail, but at least a simple example and few words for each class, so you can easily know what to do, how to use it, and also compare this library with competing ones and choose the right one for you.

    Thank you.

    opened by peldax 3
  • Activating Open Collective

    Activating Open Collective

    Hi, I'm making updates for Open Collective. Either you or another core contributor signed this repository up for Open Collective. This pull request adds financial contributors from your Open Collective https://opencollective.com/railt ❤️

    What it does:

    • adds a badge to show the latest number of financial contributors
    • adds a banner displaying contributors to the project on GitHub
    • adds a banner displaying all individuals contributing financially on Open Collective
    • adds a section displaying all organizations contributing financially on Open Collective, with their logo and a link to their website

    P.S: As with any pull request, feel free to comment or suggest changes.

    Thank you for your great contribution to the Open Source community. You are awesome! 🙌 And welcome to the Open Collective community! 😊

    Come chat with us in the #opensource channel on https://slack.opencollective.com - great place to ask questions and share best practices with other Open Source sustainers!

    opened by monkeywithacupcake 3
  • Return of controller as a list of objects instead list of arrays

    Return of controller as a list of objects instead list of arrays

    Hello. When a field are resolved by the controller, and the field type is a list, the result must to be a list of arrays, otherwise, if I return a list of objects (that can be accessible by using array annotation, because in my try I've implemented the arrayaccess interface), the values of the fields in the response are null, Railt don't resolve correctly.

    For example:

    class UserController{
     public function listAll() {
      $users = Users::findAll(); //returns a list of Users object that implement ArrayAccess interface and extends the Model class
      $r = [] 
      foreach($users as $u) {
       $r["name"] = $u["name"];
       $r["login"] = $u["login"];
      } 
      return $r
     } 
    
    } 
    

    This works, but if I try to return the users directly like this

    class UserController{
     public function listAll() {
      $users = Users::findAll(); //returns a list of Users object that implement ArrayAccess interface and extends the Model class
      
      return $users
     } 
    
    } 
    

    The result is something like this (it's just a example, ignore the json malformed) :

    {
     user:{
       "name": null
        "login": null
     }, {
       "name": null
        "login": null
     }, {
       "name": null
        "login": null
     }, 
    
    } 
    

    A list of null field values.

    Is there a way to tell Railt how to properly resolve that? Or, can I make railt able to handle with custom objects in results? Railt: 1.4.x

    Bug 
    opened by mihazs 3
  • Bump symfony/http-kernel from 4.4.3 to 4.4.13

    Bump symfony/http-kernel from 4.4.3 to 4.4.13

    Bumps symfony/http-kernel from 4.4.3 to 4.4.13.

    Release notes

    Sourced from symfony/http-kernel's releases.

    v4.4.13

    Changelog (https://github.com/symfony/http-kernel/compare/v4.4.12...v4.4.13)

    • no changes

    v4.4.12

    Changelog (https://github.com/symfony/http-kernel/compare/v4.4.11...v4.4.12)

    • bug #37841 Backport handler lock when using VAR_DUMPER_FORMAT (ogizanagi)

    v4.4.11

    Changelog (https://github.com/symfony/http-kernel/compare/v4.4.10...v4.4.11)

    • bug #37341 Fix support for PHP8 union types (nicolas-grekas)

    v4.4.10

    Changelog (https://github.com/symfony/http-kernel/compare/v4.4.9...v4.4.10)

    • bug #37182 Fix regression where Store does not return response body correctly (mpdude)

    v4.4.9

    Changelog (https://github.com/symfony/http-kernel/compare/v4.4.8...v4.4.9)

    • bug #36891 Address deprecation of ReflectionType::getClass() (derrabus)
    • bug #36833 Fix that the Store would not save responses with the X-Content-Digest header present (mpdude)
    • bug #36855 Fix error logger when stderr is redirected to /dev/null (fabpot)
    • bug #36838 Bring back the debug toolbar (derrabus)
    • bug #36789 Change priority of KernelEvents::RESPONSE subscriber (marcw)

    v4.4.8

    Changelog (https://github.com/symfony/http-kernel/compare/v4.4.7...v4.4.8)

    • bug #36434 silence E_NOTICE triggered since PHP 7.4 (xabbuh)
    • bug #36342 fix compat with Debug component (nicolas-grekas)
    • bug #36239 Prevent keys collisions in the sanitized logs processing (fancyweb)

    v4.4.7

    Changelog (https://github.com/symfony/http-kernel/compare/v4.4.6...v4.4.7)

    • no changes

    v4.4.6

    Changelog (https://github.com/symfony/http-kernel/compare/v4.4.5...v4.4.6)

    • bug #36169 fix locking for PHP 7.4+ (nicolas-grekas)
    • bug #36103 fix preloading script generation (nicolas-grekas)

    v4.4.5

    Changelog (https://github.com/symfony/http-kernel/compare/v4.4.4...v4.4.5)

    Commits
    • 2bb7b90 Update VERSION for 4.4.13
    • cdf1e9b security #cve-2020-15094 Remove headers with internal meaning from HttpClient...
    • 8e8d0ed Remove headers with internal meaning from HttpClient responses
    • a5ed890 Bump Symfony version to 4.4.13
    • f93f6b3 Update VERSION for 4.4.12
    • 98fb210 minor #37831 stop using deprecated PHPUnit APIs (xabbuh)
    • 4b232e3 stop using deprecated PHPUnit APIs
    • ce729cd Fix CS
    • b8542b3 Merge branch '3.4' into 4.4
    • 3ab83d2 Fix CS
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • how to solve n+1 problem in railt?

    how to solve n+1 problem in railt?

    I'd like to use the Deffer feature of webonyx, how can i do this in rait?

    <?php
    'resolve' => function($blogStory) {
        MyUserBuffer::add($blogStory['authorId']);
    
        return new GraphQL\Deferred(function () use ($blogStory) {
            MyUserBuffer::loadBuffered();
            return MyUserBuffer::get($blogStory['authorId']);
        });
    }
    

    solving-n1-problem

    opened by videni 1
  • directive @validate not working

    directive @validate not working

    Expected Behavior

    I want to validate the whole input data.

    What happens instead?

    { "code": 0, "error": "(Railt\SDL\Exceptions\TypeNotFoundException) Type "validate" not found and could not be loaded", "file": "At /Users/vidy/www/discovery/app/graphql/comment.graphql line 10", "trace": "#0 /Users/vidy/www/discovery/vendor/railt/railt/src/SDL/Reflection/Loader.php(72)" }

    Steps To Reproduce

    @use(class: "App\\Controller\\Admin\\CommentController")
    @use(class: "App\\Validator\\CommentValidator", as: "Comment")
    
    type Mutation {
        """
        创建评论
        """
        createComment(
          input: CommentInput!
        ): Comment!
          @route(action: "CommentController@create")
          @validate(use: "Comment")
    }
    
    input CommentInput {
       """评论正文"""
      comment: String!
      """父评论ID"""
      parent_id: ID
    }
    
    type Comment {
      id: ID!
    }
    
    
    opened by videni 3
  • Completion of work on reflection

    Completion of work on reflection

    Required for the reflection component

    1. To review the hierarchy of classes (contracts).
    2. Сompletely cover with the tests a new structure of reflection (48% more required).
    Improvement 
    opened by SerafimArts 1
  • Custom values for enum

    Custom values for enum

    I think that it's worth implementing support for custom values for enum

    Example:

    type User {
      updatedAt(format: DateTimeFormat = RFC3339): DateTime!
      createdAt(format: DateTimeFormat = RFC3339): DateTime!
    }
    
    enum DateTimeFormat {
        RFC3339: "Y-m-d\TH:i:sO"
        ISO8601: "Y-m-d\TH:i:sP"
    }
    

    What do you think about this?

    Proposition RL/SDL 
    opened by stenin-nikita 0
Releases(1.3.7)
Owner
The Railt GraphQL Framework
High quality and loosely coupled framework for developing GraphQL applications using all the modern qualities of the language.
The Railt GraphQL Framework
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

null 14 Aug 14, 2022
PHPR or PHP Array Framework is a framework highly dependent to an array structure.

this is new repository for php-framework Introduction PHPR or PHP Array Framework is a framework highly dependent to an array structure. PHPR Framewor

Agung Zon Blade 2 Feb 12, 2022
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

Rizky Alamsyah 14 Aug 14, 2022
Framework X is a simple and fast micro framework based on PHP

Framework X is a simple and fast micro framework based on PHP. I've created a simple CRUD application to understand how it works. I used twig and I created a custom middleware to handle PUT, DELETE methods.

Mahmut Bayri 6 Oct 14, 2022
Spiral Framework is a High-Performance PHP/Go Full-Stack framework and group of over sixty PSR-compatible components

Spiral HTTP Application Skeleton Spiral Framework is a High-Performance PHP/Go Full-Stack framework and group of over sixty PSR-compatible components.

Spiral Scout 152 Dec 18, 2022
Sunhill Framework is a simple, fast, and powerful PHP App Development Framework

Sunhill Framework is a simple, fast, and powerful PHP App Development Framework that enables you to develop more modern applications by using MVC (Model - View - Controller) pattern.

Mehmet Selcuk Batal 3 Dec 29, 2022
Framework X – the simple and fast micro framework for building reactive web applications that run anywhere.

Framework X Framework X – the simple and fast micro framework for building reactive web applications that run anywhere. Quickstart Documentation Tests

Christian Lück 620 Jan 7, 2023
FuelPHP v1.x is a simple, flexible, community driven PHP 5.3+ framework, based on the best ideas of other frameworks, with a fresh start! FuelPHP is fully PHP 7 compatible.

FuelPHP Version: 1.8.2 Website Release Documentation Release API browser Development branch Documentation Development branch API browser Support Forum

Fuel 1.5k Dec 28, 2022
An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols. PHP>=5.3.

Workerman What is it Workerman is an asynchronous event-driven PHP framework with high performance to build fast and scalable network applications. Wo

walkor 10.2k Dec 31, 2022
Fast php framework written in c, built in php extension

Yaf - Yet Another Framework PHP framework written in c and built as a PHP extension. Requirement PHP 7.0+ (master branch)) PHP 5.2+ (php5 branch) Inst

Xinchen Hui 4.5k Dec 28, 2022
💫 Vega is a CLI mode HTTP web framework written in PHP support Swoole, WorkerMan / Vega 是一个用 PHP 编写的 CLI 模式 HTTP 网络框架,支持 Swoole、WorkerMan

Mix Vega 中文 | English Vega is a CLI mode HTTP web framework written in PHP support Swoole, WorkerMan Vega 是一个用 PHP 编写的 CLI 模式 HTTP 网络框架,支持 Swoole、Work

Mix PHP 46 Apr 28, 2022
A PHP framework for web artisans.

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

The Laravel Framework 72k Jan 7, 2023
The Symfony PHP framework

Symfony is a PHP framework for web and console applications and a set of reusable PHP components. Symfony is used by thousands of web applications (in

Symfony 27.8k Jan 2, 2023
Open Source PHP Framework (originally from EllisLab)

What is CodeIgniter CodeIgniter is an Application Development Framework - a toolkit - for people who build web sites using PHP. Its goal is to enable

B.C. Institute of Technology 18.2k Dec 29, 2022
Yii 2: The Fast, Secure and Professional PHP Framework

Yii 2 is a modern framework designed to be a solid foundation for your PHP application. It is fast, secure and efficient and works right out of the bo

Yii Software 14k Dec 31, 2022
CakePHP: The Rapid Development Framework for PHP - Official Repository

CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Associative Data Mapping, Front Controller, and MVC. O

CakePHP 8.6k Dec 31, 2022
Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs.

Slim Framework Slim is a PHP micro-framework that helps you quickly write simple yet powerful web applications and APIs. Installation It's recommended

Slim Framework 11.5k Jan 4, 2023
High performance, full-stack PHP framework delivered as a C extension.

Phalcon Framework Phalcon is an open source web framework delivered as a C extension for the PHP language providing high performance and lower resourc

The Phalcon PHP Framework 10.7k Jan 8, 2023
🚀 PHP Microservice Full Coroutine Framework

PHP microservice coroutine framework 中文说明 Introduction Swoft is a PHP microservices coroutine framework based on the Swoole extension. Like Go, Swoft

Swoft Cloud 5.5k Dec 28, 2022