Provides TemplateView and TwoStepView using PHP as the templating language, with support for partials, sections, and helpers.

Overview

Aura View

This package provides an implementation of the TemplateView and TwoStepView patterns using PHP itself as the templating language. It supports both file-based and closure-based templates along with helpers and sections.

It is preceded by systems such as Savant, Zend_View, and Solar_View.

Foreword

Installation

This library requires PHP 5.4 or later; we recommend using the latest available version of PHP as a matter of principle. It has no userland dependencies.

It is installable and autoloadable via Composer as aura/view.

Alternatively, download a release or clone this repository, then require or include its autoload.php file.

Quality

Scrutinizer Code Quality codecov Continuous Integration

To run the unit tests at the command line, issue composer install and then ./vendor/bin/phpunit at the package root. This requires Composer to be available as composer.

This library attempts to comply with PSR-1, PSR-2, and PSR-4. If you notice compliance oversights, please send a patch via pull request.

Community

To ask questions, provide feedback, or otherwise communicate with the Aura community, please join our Google Group, follow @auraphp on Twitter, or chat with us on #auraphp on Freenode.

Getting Started

Instantiation

To instantiate a View object, use the ViewFactory:

<?php
$view_factory = new \Aura\View\ViewFactory;
$view = $view_factory->newInstance();
?>

Escaping Output

Security-minded observers will note that all the examples in this document use manually-escaped output. Because this package is not specific to any particular media type, it does not come with escaping functionality.

When you generate output via templates, you must escape it appropriately for security purposes. This means that HTML templates should use HTML escaping, CSS templates should use CSS escaping, XML templates should use XML escaping, PDF templates should use PDF escaping, RTF templates should use RTF escaping, and so on.

For a good set of HTML escapers, please consider Aura.Html.

Registering View Templates

Now that we have a View, we need to add named templates to its view template registry. These are typically PHP file paths, but templates can also be closures. For example:

<?php
$view_registry = $view->getViewRegistry();
$view_registry->set('browse', '/path/to/views/browse.php');
?>

The browse.php file may look something like this:

<?php
foreach ($this->items as $item) {
    $id = htmlspecialchars($item['id'], ENT_QUOTES, 'UTF-8');
    $name = htmlspecialchars($item['name'], ENT_QUOTES, 'UTF-8');
    echo "Item ID #{$id} is '{$name}'." . PHP_EOL;
}
?>

Note that we use echo, and not return, in templates.

N.b.: The template logic will be executed inside the View object scope, which means that $this in the template code will refer to the View object. The same is true for closure-based templates.

Setting Data

We will almost always want to use dynamic data in our templates. To assign a data collection to the View, use the setData() method and either an array or an object. We can then use data elements as if they are properties on the View object.

<?php
$view->setData(array(
    'items' => array(
        array(
            'id' => '1',
            'name' => 'Foo',
        ),
        array(
            'id' => '2',
            'name' => 'Bar',
        ),
        array(
            'id' => '3',
            'name' => 'Baz',
        ),
    )
));
?>

N.b.: Recall that $this in the template logic refers to the View object, so that data assigned to the View can be accessed as properties on $this.

The setData() method will overwrite all existing data in the View object. The addData() method, on the other hand, will merge with existing data in the View object.

Invoking A One-Step View

Now that we have registered a template and assigned some data to the View, we tell the View which template to use, and then invoke the View:

<?php
$view->setView('browse');
$output = $view->__invoke(); // or just $view()
?>

The $output in this case will be something like this:

Item #1 is 'Foo'.
Item #2 is 'Bar'.
Item #3 is 'Baz'.

Using Sub-Templates (aka "Partials")

Sometimes we will want to split a template up into multiple pieces. We can render these "partial" template pieces using the render() method in our main template code.

First, we place the sub-template in the view registry (or in the layout registry if it for use in layouts). Then we render() it from inside the main template code. Sub-templates can use any naming scheme we like. Some systems use the convention of prefixing partial templates with an underscore, and the following example will use that convention.

Second, we can pass an array of variables to be extracted into the local scope of the partial template. (The $this variable will always be available regardless.)

For example, let's split up our browse.php template file so that it uses a sub-template for displaying items.

<?php
// add templates to the view registry
$view_registry = $view->getViewRegistry();

// the "main" template
$view_registry->set('browse', '/path/to/views/browse.php');

// the "sub" template
$view_registry->set('_item', '/path/to/views/_item.php');
?>

We extract the item-display code from browse.php into _item.php:

<?php
$id = htmlspecialchars($item['id'], ENT_QUOTES, 'UTF-8');
$name = htmlspecialchars($item['name'], ENT_QUOTES, 'UTF-8')
echo "Item ID #{$id} is '{$name}'." . PHP_EOL;
?>

Then we modify browse.php to use the sub-template:

<?php
foreach ($this->items as $item) {
    echo $this->render('_item', array(
        'item' => $item,
    ));
?>

The output will be the same as earlier when we invoke the view.

N.b.: Alternatively, we can use include or require to execute a PHP file directly in the current template scope.

Using Sections

Sections are similar to sub-templates (aka "partials") except that they are captured inline for later use. In general, they are used by view templates to capture output for layout templates.

For example, we can capture output in the view template to a named section ...

<?php
// begin buffering output for a named section
$this->beginSection('local-nav');

echo "<div>";
// ... echo the local navigation output ...
echo "</div>";

// end buffering and capture the output
$this->endSection();
?>

... and then use that output in a layout template:

<?php
if ($this->hasSection('local-nav')) {
    echo $this->getSection('local-nav');
} else {
    echo "<div>No local navigation.</div>";
}
?>

In addition, the setSection() method can be used to set the section body directly, instead of capturing it:

<?php
$this->setSection('local-nav', $this->render('_local-nav'));
?>

Using Helpers

The ViewFactory instantiates the View with an empty HelperRegistry to manage helpers. We can register closures or other invokable objects as helpers through the HelperRegistry. We can then call these helpers as if they are methods on the View.

<?php
$helpers = $view->getHelpers();
$helpers->set('hello', function ($name) {
    return "Hello {$name}!";
});

$view_registry = $view->getViewRegistry();
$view_registry->set('index', function () {
    echo $this->hello('World');
});

$view->setView('index');
$output = $view();
?>

This library does not come with any view helpers. You will need to add your own helpers to the registry as closures or invokable objects.

Custom Helper Managers

The View is not type-hinted to any particular class for its helper manager. This means you may inject an arbitrary object of your own at View construction time to manage helpers. To do so, pass a helper manager of your own to the ViewFactory.

<?php
class OtherHelperManager
{
    public function __call($helper_name, $args)
    {
        // logic to call $helper_name with
        // $args and return the result
    }
}

$helpers = new OtherHelperManager;
$view = $view_factory->newInstance($helpers);
?>

For a comprehensive set of HTML helpers, including form and input helpers, please consider the Aura.Html package and its HelperLocator as an alternative to the HelperRegistry in this package. You can pass it to the ViewFactory like so:

<?php
$helpers_factory = new Aura\Html\HelperLocatorFactory;
$helpers = $helpers_factory->newInstance();
$view = $view_factory->newInstance($helpers);
?>

Rendering a Two-Step View

To wrap the main content in a layout as part of a two-step view, we register layout templates with the View and then call setLayout() to pick one of them for the second step. (If no layout is set, the second step will not be executed.)

Let's say we have already set the browse template above into our view registry. We then set a layout template called default into the layout registry:

<?php
$layout_registry = $view->getLayoutRegistry();
$layout_registry->set('default', '/path/to/layouts/default.php');
?>

The default.php layout template might look like this:

<html>
<head>
    <title>My Site</title>
</head>
<body>
<?= $this->getContent(); ?>
</body>
</html>

We can then set the view and layout templates on the View object and then invoke it:

<?php
$view->setView('browse');
$view->setLayout('default');
$output = $view->__invoke(); // or just $view()
?>

The output from the inner view template is automatically retained and becomes available via the getContent() method on the View object. The layout template then calls getContent() to place the inner view results in the outer layout template.

N.b. We can also call setLayout() from inside the view template, allowing us to pick a layout as part of the view logic.

The view template and the layout template both execute inside the same View object. This means:

  • All data values are shared between the view and the layout. Any data assigned to the view, or modified by the view, is used as-is by the layout.

  • All helpers are shared between the view and the layout. This sharing situation allows the view to modify data and helpers before the layout is executed.

  • All section bodies are shared between the view and the layout. A section that is captured from the view template can therefore be used by the layout template.

Closures As Templates

The view and layout registries accept closures as templates. For example, these are closure-based equivlents of the browse.php and _item.php template files above:

<?php
$view_registry->set('browse', function () {
    foreach ($this->items as $item) {
        echo $this->render('_item', array(
            'item' => $item,
        ));
    }
);

$view_registry->set('_item', function (array $vars) {
    extract($vars, EXTR_SKIP);
    $id = htmlspecialchars($item['id'], ENT_QUOTES, 'UTF-8');
    $name = htmlspecialchars($item['name'], ENT_QUOTES, 'UTF-8')
    echo "Item ID #{$id} is '{$name}'." . PHP_EOL;
);
?>

When registering a closure-based template, continue to use echo instead of return when generating output. The closure is rebound to the View object, so $this in the closure will refer to the View just as it does in a file-based template.

A bit of extra effort is required with closure-based sub-templates (aka "partials"). Whereas file-based templates automatically extract the passed array of variables into the local scope, a closure-based template must:

  1. Define a function parameter to receive the injected variables (the $vars param in the _item template); and,

  2. Extract the injected variables using extract(). Alternatively, the closure may use the injected variables parameter directly.

Aside from that, closure-based templates work exactly like file-based templates.

Registering Template Search Paths

We can also tell the view and layout registries to search the filesystem for templates. First, we tell the registry what directories contain template files:

<?php
$view_registry = $view->getViewRegistry();
$view_registry->setPaths(array(
    '/path/to/foo',
    '/path/to/bar',
    '/path/to/baz'
));
?>

When we refer to named templates later, the registry will search from the first directory to the last. For finer control over the search paths, we can call prependPath() to add a directory to search earlier, or appendPath() to add a directory to search later. Regardless, the View will auto-append .php to the end of template names when searching through the directories.

Template Namespaces

We can also add namespaced templates which we can refer to with the syntax namespace::template. We can add directories that correspond to namespaces:

<?php
$view_registry = $view->getViewRegistry();
$view_registry->appendPath('/path/to/templates', 'my-namespace');

$view->setView('my-namespace::browse');

When we refer to namespaced templates, only the paths associated with that namespace will be searched.

Changing The Template File Extension

By default, each TemplateRegistry will auto-append .php to template file names. If the template files end with a different extension, change it using the setTemplateFileExtension() method:

<?php
$view_registry = $view->getViewRegistry();
$view_registry->setTemplateFileExtension('.phtml');
?>

The TemplateRegistry instance used for the layouts is separate from the one for the views, so it may be necessary to change the template file extension on it as well:

<?php
$layout_registry = $view->getLayoutRegistry();
$layout_registry->setTemplateFileExtension('.phtml');
?>

Advanced Configuration

Alternatively you can pass $helpers, mapping information or paths for views and layouts as below.

<?php
$view_factory = new \Aura\View\ViewFactory;
$view = $view_factory->newInstance(
    $helpers = null,
    [
        'browse' => '/path/to/views/browse.php'
    ],
    [
        '/path/to/views/welcome',
        '/path/to/views/user',
    ],
    [
        'layout' => '/path/to/layouts/default.php'
    ],
    [
        '/path/to/layouts',
    ],
);
?>

If you are passing the mapping information or paths to views and layouts you don't need to call the getViewRegistry or getLayoutRegistry and set the mapping information.

Eg :

$view_registry = $view->getViewRegistry();
$view_registry->set('browse', '/path/to/views/browse.php');

$layout_registry = $view->getLayoutRegistry();
$layout_registry->set('default', '/path/to/layouts/default.php');
Comments
  • Add

    Add "Namespace" support

    Zend Expressive Template Interface defines support for namespaces using the :: scope resolution operator.

    Personally, I've just been using paths to basically simulate some approximation of this functionality, and had previously been considering trying to add some kind of PSR-4-like directory definition that would basically just pretend a directory structure was deeper than it was, but this seems like a solution, and seems to exist elsewhere too.

    Thoughts?

    (On an unrelated note, and thoughts/idea on starting 3.x anytime so we can modernize some syntax and get rid of some of the old cruft?)

    Ready for merge 
    opened by jakejohns 8
  • Possible bug with the aura closure view

    Possible bug with the aura closure view

    Hi Paul,

    I was just playing around to learn and implement ADR in aura. See https://github.com/harikt/adr/commit/f7f79e898d182c4fb9e0222044b9d1224e3498ad

    In that I was writing a test on the render functionality done with aura/view. I am seeing something like

    PHPUnit 4.0.13 by Sebastian Bergmann.
    
    Configuration read from /var/www/adr/tests/phpunit.xml
    
    E.
    
    Time: 30 ms, Memory: 3.75Mb
    
    There was 1 error:
    
    1) Aura\Action_Bundle\AuraViewTest::testRenderHello
    Missing argument 1 for Aura\View\View::Aura\Action_Bundle\{closure}()
    
    /var/www/adr/tests/src/AuraViewTest.php:17
    /var/www/adr/vendor/aura/view/src/View.php:58
    /var/www/adr/vendor/aura/view/src/View.php:58
    /var/www/adr/vendor/aura/view/src/View.php:32
    /var/www/adr/src/AuraView.php:24
    /var/www/adr/tests/src/AuraViewTest.php:38
    
    FAILURES!
    Tests: 2, Assertions: 1, Errors: 1.
    

    This sounds to me that there is some sort of bug in the View.

    opened by harikt 8
  • Helper updates

    Helper updates

    I added a markdown document for most of the helpers. It's a work in progress for sure. I added fluency to some of the helpers and updated the tests. I fixed the ordering of the styles helper to match that of the scripts helper. It was sorting via the tag first, then position. I think it should sort via the position, and then by the order it was added to the array. Would you agree?

    I also fixed a 'bool' in the checkboxes and radios helper for the 'checked' parameter.

    I probably should have had a single pr for some of these commits. I hope this one is ok. Also, I fixed my develop branch so it should work properly with the auraphp:develop branch.

    opened by jelofson 7
  • __construct() method, not __invoke() method, being called on helpers

    __construct() method, not __invoke() method, being called on helpers

    I am creating custom helpers, and registering them with the HelperRegistry. These helpers are objects, and the object is instantiated using Aura.Di, thusly:

    $di->params['Aura\View\HelperRegistry'] = [
        'map' => [
            'messages' => $di->lazyNew('Modus\Template\Helper\Messages'),
            'paginator' => $di->lazyNew('Modus\Template\Helper\Paginator'),
            'linkgenerator' => $di->lazyNew('Modus\Template\Helper\LinkGenerator'),
        ]
    ];
    

    The problem is, when I use them in my views, the __construct() method is called, not the __invoke() method. Meaning that to call these methods, I must do the following:

    <?php
    $result = $this->linkgenerator();
    
    echo $result('auth2');
    
    ?>
    

    This isn't the way helpers used to work. The only way it seems to fix this issue is to create a closure, like so:

    $di->params['Aura\View\HelperRegistry'] = [
        'map' => [
            'linkgenerator' => function($route) use ($di) {
                $obj = $di->newInstance('Modus\Template\Helper\LinkGenerator');
                return $obj($route);
            },
        ]
    ];
    

    This is clearly sub-optimal. Also, there seems to be an issue whereby using $di->lazyNew() is a problem, as though lazyNew() itself is not callable.

    opened by ghost 6
  • Aura.View/helper

    Aura.View/helper

    Hi Paul, added a $pos param to the meta helper and added 2 methods to the scripts helper, inline script and conditional script, thought you might be interested.

    Jeff Surgeson SA

    opened by jsurgeson 6
  • Could you include a demo project/big picture in these repos?

    Could you include a demo project/big picture in these repos?

    When learning both aura.router and aura.view, it took me seeing somebody else's code before the entire picture clicked and I was able to understand how the libraries worked. Any chance you guys could include some sort of sample code in these repos? Maybe it's just me, but when just reading the instructions, I had trouble grasping exactly what was going on until I saw some tutorials detailing the entire process.

    opened by jamesaspence 5
  • Experimental (better, branched it and fixed a PSR error)

    Experimental (better, branched it and fixed a PSR error)

    Now I did a correct branch so I don't soil the develop branch with experimental tinkering.

    Also fixed a PSR error in Checkboxes.php (the inline if statements in the for loop in invoke() )

    Here are the other PSR errors that showed up, which supposedly were already in before the fork:

    http://pastebin.com/ecBJvMuL

    opened by belgianguy 5
  • unit test to vfsStream

    unit test to vfsStream

    Try changing the unit tests to make use of https://github.com/mikey179/vfsStream .

    So we don't need to worry about the file system and permissions of directory system.

    Improvement 
    opened by harikt 5
  • Add fluency to links helper add method

    Add fluency to links helper add method

    Thought it might be handy to use the links helper fluently Rather than...

    $links = $this->links();
    $links->add($attribs);
    $links->add($otherattribs);
    echo $links->get();
    

    Do this

    echo $this->links()
                   ->add($attribs)
                   ->add($otherattribs)
                   ->get();
    

    What do you think? Seem reasonable?

    opened by jelofson 4
  • Multiple instance of Aura\View\Helper\Styles

    Multiple instance of Aura\View\Helper\Styles

    There are multiple instances of Aura\View\Helper\Styles and I feel not just styles but almost all , and finally the styles array becoming null class Aura\View\Helper\Styles#266 (2) { protected $styles => array(0) { } protected $indent => string(4) " " }

    I was looking into the changes of the config/default.php https://github.com/auraphp/Aura.View/compare/master...develop#L2R30

    Bug 
    opened by harikt 4
  • DX : Bring TemplateFinder back to v2

    DX : Bring TemplateFinder back to v2

    Hi Paul,

    When working on small projects I prefer to have a single templates folder. I could not comment for others but this seems to me a very lacking feature as I have already mentioned some time back.

    Before throwing an Exception do you think of looking for the template via TemplateFinder as we did in v1 https://github.com/auraphp/Aura.View/blob/develop/src/Aura/View/TemplateFinder.php ?

    Thank you

    opened by harikt 3
  • Indirect modification

    Indirect modification

    Currently you cannot modify arrays that are set as view variables

    $view->a = [];
    $view->a[] = 1; // PHP Notice:  Indirect modification of overloaded property Aura/View/View::$a has no effect
    var_dump($view->a); // empty array
    

    is it a bug or expected behavior?

    The fix is simple: return field by reference

    public function &__get($key)
    

    I can make pr if you agree that it's a bug

    opened by arokettu 2
Releases(2.4.0)
  • 2.4.0(Feb 5, 2022)

    • Added namespace support to TemplateRegistry by @jakejohns via https://github.com/auraphp/Aura.View/pull/83.
    • Updated CI to support php versions from 5.4 to 8.1 by @harikt via https://github.com/auraphp/Aura.View/pull/85
    Source code(tar.gz)
    Source code(zip)
  • 2.3.0(Jul 21, 2017)

    • Added ability to set map and path in ViewFactory. https://github.com/auraphp/Aura.View/pull/73
    • Removed CHANGES.md file.
    • Added CHANGELOG.md
    Source code(tar.gz)
    Source code(zip)
  • 2.2.1(Oct 3, 2016)

  • 2.2.0(Jan 21, 2016)

  • 2.1.1(Mar 27, 2015)

  • 2.1.0(Mar 16, 2015)

    This release has one feature addition, in addition to doucmentation and support file updates.

    Per @harikt, we have brought back the "finder" functionality from Aura.View v1. This means the TemplateRegistry can now search through directory paths to find templates implicitly, in addition to the existing explicitly registered templates. (Explicit mappings take precedence over search paths.)

    Thanks also to @iansltx for his HHVM-related testing work.

    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Nov 7, 2014)

    • TST: Update testing structure, and disable auto-resolve for container tests
    • DOC: Update README and docblocks
    • FIX: TemplateRegistry map now passes the array via set to make the file inside a closure
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Aug 30, 2014)

    First stable 2.0 release.

    • DOC: Update docblocks and README.
    • CHG: View::render() now takes a second param, $data, for an array of vars to be extract()ed into the template scope. Closure-based templates will need to extract this on their own. (The previous technique of placing partial vars in the main template object still works.)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta2(May 22, 2014)

    • [BRK] Stop using a "content variable" and begin using setContent()/getContent() instead. In your layouts, replace echo $this->content_var_name with echo $this->getContent(). (This also removes the setContentVar() and getContentVar() methods.)
    • [ADD] Add support for sections per strong desire from @harikt, which fixes #46. The new methods are setSection(), hasSection(), and getSection(), along with beginSection() and endSection().
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta1(May 14, 2014)

Owner
Aura for PHP
High-quality, well-tested, standards-compliant, decoupled libraries that can be used in any codebase.
Aura for PHP
Integration testing helpers for the Slim Framework

Slim Test Helpers Integration testing helpers for the Slim Framework 3 For a full example, please see the companion repo at there4/slim-unit-testing-e

There4 60 Oct 26, 2022
Zephir is a compiled high level language aimed to the creation of C-extensions for PHP.

Zephir - is a high level programming language that eases the creation and maintainability of extensions for PHP. Zephir extensions are exported to C c

Zephir Language 3.2k Dec 27, 2022
Jin microservices is a complete microservice demo based on PHP language + hyperf microservices framework

介绍 Jin-microservices是基于 php 语言 + hyperf 微服务 框架的完整微服务demo。 github:https://github.com/Double-Jin/jin-microservices gitee:https://gitee.com/ljj96/jin-mic

null 114 Dec 29, 2022
Phpactor Language Server

This package provides a platform for building a Language Server according to the Language Server Specification

Phpactor 27 Dec 24, 2022
Motan - a cross-language remote procedure call(RPC) framework for rapid development of high performance distributed services

Motan-PHP Overview Motan is a cross-language remote procedure call(RPC) framework for rapid development of high performance distributed services.

Weibo R&D Open Source Projects 81 Nov 19, 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
Simple live support server with PHP Swoole Websocket and Telegram API

Telgraf Simple live support server with PHP Swoole Websocket and Telegram API. Usage Server Setup Clone repository with following command. git clone h

Adem Ali Durmuş 6 Dec 30, 2022
Multilanguage support for Slim framework 2

slim-multilanguage This is an extension to the SLIM framework vers.2 to enable simple route localization. ##Installation Add dependecy to composer.jso

Simone Todaro 15 Jul 11, 2021
QPM, the process management framework in PHP, the efficient toolkit for CLI development. QPM provides basic daemon functions and supervision mechanisms to simplify multi-process app dev.

QPM QPM全名是 Quick(or Q's) Process Management Framework for PHP. PHP 是强大的web开发语言,以至于大家常常忘记PHP 可以用来开发健壮的命令行(CLI)程序以至于daemon程序。 而编写daemon程序免不了与各种进程管理打交道。Q

Comos 75 Dec 21, 2021
Kit is a lightweight, high-performance and event-driven web services framework that provides core components such as config, container, http, log and route.

Kit What is it Kit is a lightweight, high-performance and event-driven web services framework that provides core components such as config, container,

null 2 Sep 23, 2022
The package provides definition syntax. Definition is describing a way to create and configure a service or an object.

Yii Definitions The package ... Requirements PHP 7.4 or higher. Installation The package could be installed with composer: composer require yiisoft/de

Yii Software 6 Jul 15, 2022
Provides database storage and retrieval of application settings, with a fallback to the config classes.

Provides database storage and retrieval of application settings, with a fallback to the config classes.

CodeIgniter 4 web framework 47 Dec 29, 2022
🎲 This project provides an integration for the Doctrine ORM and the Hyperf framework

Hyperf ?? Doctrine This project provides an integration for the Doctrine ORM and the Hyperf framework. Install composer require leocavalcante/hyperf-d

Leo Cavalcante 49 Dec 3, 2022
This package provides some basic methods to implement a self updating functionality for your Laravel application. Already bundled are some methods to provide a self-update mechanism via Github or some private repository via http.

This package provides some basic methods to implement a self updating functionality for your Laravel 5 application. Already bundled are some methods to provide a self-update mechanism via Github.

Holger Lösken 311 Dec 31, 2022
This package provides a high performance HTTP server to speed up your Laravel/Lumen application based on Swoole.

This package provides a high performance HTTP server to speed up your Laravel/Lumen application based on Swoole.

Swoole Taiwan 3.9k Jan 8, 2023
This extension provides a view renderer for Pug templates for Yii framework 2.0 applications.

This extension provides a view renderer for Pug templates for Yii framework 2.0 applications.

Revin Roman 9 Jun 17, 2022
This extension provides Flysystem integration for the Yii framework

This extension provides Flysystem integration for the Yii framework. Flysystem is a filesystem abstraction which allows you to easily swap out a local filesystem for a remote one.

Alexander Kochetov 276 Dec 9, 2022
A simple class that provides access to country & state list.

GeoData A simple class that provides access to country & state list. Installation composer require ahmard/geodata Usage Fetch country list <?php use

Ahmad Mustapha 4 Jun 20, 2022