1. Go to this page and download the library: Download adhocore/phalcon-ext library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
adhocore / phalcon-ext example snippets
$di->setShared('redis', function () {
return new \PhalconExt\Cache\Redis(new \Phalcon\Cache\Frontend\None(['lifetime' => 0]));
});
// Call native \Redis methods like:
$di->get('redis')->getConnection()->hGet();
$di->get('redis')->getConnection()->info();
$di = new PhalconExt\Di\FactoryDefault;
$di->setShared('dispatcher', Phalcon\Cli\Dispatcher::class);
$di->setShared('router', Phalcon\Cli\Router::class);
$di->setShared('config', new Phalcon\Config([
'console' => [
'tasks' => [
// Register your tasks here: 'name' => class
// You will define their options/arguments in respective `onConstruct()`
'main' => Your\MainTask::class,
],
],
]));
$console = new PhalconExt\Cli\Console($di, 'MyApp', 'v1.0.1');
// Or if you have your own Console extends, just use the trait
class YourConsole extends \Phalcon\Cli\Console
{
use PhalconExt\Cli\Extension;
}
class MainTask extends Phalcon\Cli\Task
{
public function onConstruct()
{
($console = $this->getDI()->get('console'))
->command('main', 'Main task ...', false)
->arguments('< ->option('')
->option('')
->tap($console)
->schedule('@5mintues') // @10minutes, @15minutes, @weekly, @daily, @yearly, @hourly ...
;
}
public function mainAction()
{
$io = $this->interactor;
// Access defined args/opts for writing to terminal:
$io->write($this->command->
class HelloConsole
{
// Prints hello every time you run a console cmd, just before execution
public function before(PhalconExt\Cli\Console $console)
{
$console->getDI()->get('interactor')->bgGreenBold('Hello', true);
return true; // Indicates success and no-objection!
}
}
$console
->command('task:action', ...)
->arguments(...)->option(...)
->tap($console)
->schedule('crontab expression') // You can also use humanly phrases: @daily, @hourly
;
$di->setShared('config', new \Phalcon\Config([
'database' => [
'driver' => 'sqlite',
'dbname' => __DIR__ . '/.var/db.db',
// ... other options (see phalcon &/or pdo docs)
],
]);
$di->setShared('db', function () {
// Can use Mysql or Postgresql too
return (new \PhalconExt\Db\Sqlite($this->get('config')->toArray()['database']));
});
// Or if you have your own already, just use the trait
class YourDb extends \Phalcon\Db\Adapter
{
use PhalconExt\Db\Extension;
}
$di->get('db')->insertAsBulk('table', [
['name' => 'name1', 'status' => 'status1'],
['details' => 'detail2', 'name' => 'name2'], // columns dont need to be ordered or balanced
]);
$di = new \PhalconExt\Di\FactoryDefault;
// Or if you have your own already, just use the trait
class YourDi extends \Phalcon\Di
{
use PhalconExt\Di\Extension;
}
$di->restore(); // All
$di->restore(['service']); // One
class AnyClass
{
use \PhalconExt\Di\ProviesDi;
public function anyFn()
{
$di = $this->di();
$db = $this->di('db');
}
}
$di->setShared('config', new \Phalcon\Config([
'ajax' => [
'uriPrefix' => '/ajax',
],
]);
class Ajax extends \PhalconExt\Http\BaseMiddleware
{
/** @var string The root key in config having settings for Ajax middleware */
protected $configKey = 'ajax';
/**
* For any uri starting with `/ajax`, allow if only it is real ajax request.
*
* Register as before handler because we will abort before actual exceution if not ajax.
*
* @return bool
*/
public function before(Phalcon\Http\Request $request, Phalcon\Http\Response $response): bool
{
list(, $uri) = $this->getRouteNameUri();
if (\stripos($uri, $this->config['uriPrefix']) !== 0) {
return true;
}
if (!$request->isAjax()) {
// Aborts/stops the app. All other middlewares down the line are skipped
return $this->abort(400);
}
return true;
}
}
// Usage is pretty simple:
// Create an app!
$app = new Phalcon\Mvc\Application($di);
// OR micro
$app = new Phalcon\Mvc\Micro($di);
// Wrap the app with middleware and run it
(new PhalconExt\Http\Middlewares([Ajax::class]))->wrap($app);
$di->get('authenticator')->getSubject();
$di->setShared('config', new \Phalcon\Config([
'apiAuth' => [
// 14 days in seconds (http://stackoverflow.com/questions/15564486/why-do-refresh-tokens-expire-after-14-days)
'refreshMaxAge' => 1209600,
// Prefix to use in stored tokens (max 4 chars)
'tokenPrefix' => 'RF/',
// The route to generate/refresh access tokens.
// genrerate: curl -XPOST -d 'grant_type=password&username=&password=' /api/auth
// refresh: curl -XPOST -d 'grant_type=refresh_token&refresh_token=' /api/auth
// It can also accept json payload:
// -H 'content-type: application/json' -d {"grant_type":"refresh_token","refresh_token":""}
'authUri' => '/api/auth',
// The permission scopes are\ApiAuth::class,
]))->wrap(new Phalcon\Mvc\Micro($di));
$di->setShared('config', new \Phalcon\Config([
'httpCache' => [
// cache life- time to live in mintues
'ttl' => 60,
// White listed uri/routes to enable caching
'routes' => [
// for absolute uri, prepend forward `/`
'/content/about-us',
// or you can use route name without a `/`
'home',
],
],
]);
$di->setShared('config', new \Phalcon\Config([
'cors' => [
'exposedHeaders' => [],
// Should be in lowercases.
'allowedHeaders' => ['x-requested-with', 'content-type', 'authorization'],
// Should be in uppercase.
'allowedMethods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
// Requests originating from here can entertain CORS.
'allowedOrigins' => [
'http://127.0.0.1:1234',
],
// Cache preflight for 7 days (expressed in seconds).
'maxAge' => 604800,
],
]);
$app = new Phalcon\Mvc\Micro($di);
// Set all your middlewares in an array using class FQCN, they are lazily loaded
// They are executed in order of their presence
// If a middleware returns `false` from its `before()` or `after()` events,
// all other middlewares down the line are skipped
$middlewares = new PhalconExt\Http\Middlewares([
PhalconExt\Http\Middleware\Throttle::class,
PhalconExt\Http\Middleware\ApiAuth::class,
PhalconExt\Http\Middleware\Cors::class,
PhalconExt\Http\Middleware\Cache::class,
]);
// Wrap and run the app!
$middlewares->wrap($app);
// The app is wrapped and run automatically so you dont have to do:
// $app->handle();
class AnyClass
{
use \PhalconExt\Logger\LogsToFile;
protected $fileExtension = '.log';
public function anyFn()
{
$this->activate('/path/to/log/dir/');
$this->log('Some message', \Phalcon\Logger::INFO);
}
}
$di->setShared('config', new \Phalcon\Config([
'mail' => [
'driver' => 'null',
'from' => [
'name' => 'Test',
'email' => 'test@localhost',
],
// for driver 'smtp':
'host' => 'smtp.server.com',
'port' => 425,
'encryption' => true,
'username' => 'user',
'password' => 'pass',
// for driver sendmail only (optional)
'sendmail' => '/sendmail/binary',
],
]);
$di->setShared('mailer', function () {
return new \PhalconExt\Mail\Mailer($this->get('config')->toArray()['mail']);
});
$mail = $di->get('mailer')->newMail();
// Or from view template
$mail = $di->get('mailer')->newTemplateMail('view/file.twig', ['view' => 'params']);
$mail->setTo('test@localhost')->setSubject('Hi')->setBody('Hello')->mail();
// Attachments:
$mail->attachFile('/path/to/file', 'optional attachment name');
$mail->attachFiles(['/path/to/file1', '/path/to/file2']);
// OR
$mail->attachFiles([
'attachment name 1' => '/path/to/file1',
'attachment name 2' => '/path/to/file2',
]);
$mail->attachRaw('Raw plain text data', 'rawtext.txt', 'text/plain');
class AnyClass
{
use \PhalconExt\Mail\Mailable;
public function anyFn()
{
$this->mail('test@local', 'Hi', ['body' => 'Hello']);
$this->mail('test@local', 'Hi', ['template' => 'view/file.twig', 'params' => ['key' => 'value']]);
}
}
$di->get('validation')->register('gmail', function ($data) {
// You can access current validation instance with `$this`
// You can also access current validator options with `$this->getOption(...)`
return stripos($this->getCurrentValue(), '@gmail.com') > 0;
}, 'Field :field must be an email with @gmail.com');
$validation = $this->di('validation');
$rules = [
// Can be string (With `abort` if the field `id` is invalid, following validations are aborted)
'id' => ' validations are aborted
'abort' => true,
],
// validate if only exist in dataset
'xyz' => 'length:5|if_exist',
];
// Validate against empty data (can be array or object)
$data = []; // OR $data = new \stdClas OR $data = new SomeClass($someData)
$validation->run($rules, $data);
$pass = $validation->pass(); // false
$fail = $validation->fail(); // true
$errors = $validation->getErrorMessages(); // array
// Checks `users` table for `id` column with value 1
$rules = ['users' => 'exist'];
$data = ['users' => 1]; // Data can be array
// Checks `users` table for `username` column with value 'admin'
$rules = ['username' => 'exist:table:users'];
$data = new User(['username' => 'admin']); // Data can be model/entity
// Checks `users` table for `login` column with value 'admin@localhost'
$rules = ['email' => 'exist:table:users;column:login'];
$data = (object) ['email' => 'admin@localhost']; // Data can be any Object
// Run the rules
$validation->run($rules, $data);
$di->setShared('config', new \Phalcon\Config([
'view' => [
'dir' => __DIR__ . '/view/',
],
// Required
'twig' => [
'view_dirs' => [__DIR__ . '/view/'], // array
'auto_reload' => getenv('APP_ENV') !== 'prod',
'cache' => __DIR__ . '/.var/view/',
// ... other options (see twig docs)
],
]);
// You must have view setup with twig engine enabled.
$di->setShared('view', function () {
return (new View)
->setViewsDir($this->get('config')->toArray()['view']['dir'])
->registerEngines([
'.twig' => 'twig',
]);
});
$di->setShared('twig', function () {
$twig = new PhalconExt\View\Twig($this->get('view'), $this);
// Here you can:
// $twig->addFilter(...)
// $twig->addExtension(...)
return $twig;
});
// standalone
$di->get('twig')->render('template.twig', ['view' => 'params']);
// or as view
$di->get('view')->render('template.twig', ['view' => 'params']); // .twig is optional
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.