Phalcon Repositories
, (*1)
Introduction
Phalcon Repositories lets you easily build repositories for your Phalcon models, for both SQL and Mongo drivers., (*2)
PHP 7.1+ and Phalcon 3.2+ are required., (*3)
Installation
Phalcon Repositories can be installed through Composer, just run composer require michele-angioni/phalcon-repositories., (*4)
Usage with SQL Drivers
The abstract class AbstractRepository consists of a model wrapper with numerous useful queries to be performed over the Phalcon models.
This way implementing the repository pattern becomes straightforward., (*5)
As an example let's say we have a MyApp\Models\Posts model., (*6)
The easiest way to create a Posts repository is to define a class as such, (*7)
<?php
namespace MyApp\Repos;
use MicheleAngioni\PhalconRepositories\AbstractRepository;
use MyApp\Models\Posts;
class PostsRepository extends AbstractRepository
{
protected $model;
public function __construct(Posts $model)
{
$this->model = $model;
}
}
Suppose now we need the Post repository in our PostController. For example we can retrieve a Post this way, (*8)
<?php
namespace MyApp\Controllers;
use MyApp\Repos\PostsRepository as PostsRepo;
use Phalcon\Mvc\Controller;
use MyApp\Models\Posts;
class PostsController extends Controller
{
public function showAction($idPost)
{
$postsRepo = new PostsRepo(new Posts());
$post = $postsRepo->find($idPost);
// Use the retrieved post
}
}
We could also bind out repository to the container through the Phalcon dependency injection.
We just need to add a new postRepo service in our bootstrap file, (*9)
$di->set('postsRepo', function () {
return new MyApp\Repos\PostsRepository(new \MyApp\Models\Posts());
});
and than use it in the controller, (*10)
<?php
namespace MyApp\Controllers;
use Phalcon\Mvc\Controller;
class PostsController extends Controller
{
public function showAction($idPost)
{
$postsRepo = $this->getDI()->getPostsRepo();
$post = $postsRepo->find($idPost);
// Use the retrieved Post
}
}
Usage with MongoDB
The abstract class AbstractCollectionRepository, similary to AbstractRepository, consists of a model wrapper with numerous useful queries to be performed over the Phalcon collections.
This way implementing the repository pattern becomes straightforward., (*11)
As an example let's say we have a MyApp\Models\Posts collection, (*12)
<?php
namespace MyApp\Models;
use Phalcon\Mvc\MongoCollection;
class Posts extends MongoCollection
{
use \MicheleAngioni\PhalconRepositories\MongoFix; // Fix for Phalcon 3.1.x with PHP 7.1
[...]
}
The easiest way to create a Posts repository is to define a class as such, (*13)
<?php namespace MyApp\Repos;
use MicheleAngioni\PhalconRepositories\AbstractCollectionRepository;
use MyApp\Models\Posts;
class PostsRepository extends AbstractCollectionRepository
{
protected $model;
public function __construct(Posts $model)
{
$this->model = $model;
}
}
Suppose now we need the Post repository in our PostController. For example we can retrieve a Post this way, (*14)
<?php
namespace MyApp\Controllers;
use MyApp\Repos\PostsRepository as PostsRepo;
use Phalcon\Mvc\Controller;
use MyApp\Models\Posts;
class PostsController extends Controller
{
public function showAction($idPost)
{
$postsRepo = new PostsRepo(new Posts());
$post = $postsRepo->find($idPost);
// Use the retrieved Post
}
}
We could also bind out repository to the container through the Phalcon dependency injection.
We just need to add a new postRepo service in our bootstrap file, (*15)
$di->set('postsRepo', function () {
return new MyApp\Repos\PostsRepository(new \MyApp\Models\Posts());
});
and than use it in the controller, (*16)
<?php
namespace MyApp\Controllers;
use Phalcon\Mvc\Controller;
class PostsController extends Controller
{
public function showAction($idPost)
{
$postsRepo = $this->getDI()->getPostsRepo();
$post = $postsRepo->find($idPost);
// Use the retrieved post
}
}
Method list
The AbstractRepository and AbstractCollectionRepository empower automatically our repositories of the following public methods:, (*17)
all()
find($id)
findOrFail($id)
first()
firstOrFail()
firstBy(array $where = [])
firstOrFailBy(array $where = [])
getBy(array $where = [])
getByLimit(int $limit, array $where = [])
getByOrder(string $orderBy, array $where = [], string $order = 'desc', int $limit = 0)
getIn(string $whereInKey, array $whereIn = [], string $orderBy = null, string $order = 'desc', int $limit = 0)
getNotIn(string $whereNotInKey, array $whereNotIn = [], string $orderBy = null, string $order = 'desc', int $limit = 0)
getInAndWhereByPage(int $page = 1, int $limit = 10, string $whereInKey = null, array $whereIn = [], $where = [], $orderBy = null, string $order = 'desc')
getByPage(int $page = 1, int $limit = 10, array $where = [], string $orderBy = null, string $order = 'desc')
create(array $inputs = [])
updateById($id, array $inputs)
destroy($id)
destroyFirstBy(array $where)
count()
countBy(array $where = [])
The AbstractRepository contains also the methods:, (*18)
getByGroupBy(string $groupBy, array $where = [], bool $addCounts = false)
truncate()
while the AbstractCollectionRepository allows for aggregations through:, (*19)
getAggregate(array $match = [], array $project = [], array $group = [], int $limit = 0)
The $where parameter with SQL drivers
The $where parameter allows the use of various operators with the SQL driver, other than the equals =, even the LIKE keyword., (*20)
The following formats are supported:, (*21)
-
'key' => 'value', (*22)
Examples:, (*23)
$where = ['username' => 'Richard']
-
'key' => ['value', 'operator'], (*24)
Examples:, (*25)
$where = ['age' => [30, '=']]
$where = ['age' => [30, '<']]
$where = ['age' => [30, '>']]
$where = ['username' => ['%Fey%', 'LIKE']]
-
['key1%OR%key2'] => ['value', 'operator'], (*26)
Examples:, (*27)
`$where = ['username%OR%description' => ['%Feynman%', 'LIKE']]`
SQL Injection
The AbstractRepository and AbstractCollectionRepository use bind parameters for all $id and $where clauses.
$inputs parameters in create and update queries are automatically escaped by Phalcon., (*28)
The security of the other parameters ($whereInKey, $whereIn, $orderBy, $order, $limit etc.) is up to you., (*29)
Testing
Install dependencies with composer install and then run vendor/bin/phpunit tests., (*30)
Contribution guidelines
Phalcon Repositories follows PSR-1, PSR-2 and PSR-4 PHP coding standards, and semantic versioning., (*31)
Pull requests are welcome., (*32)
License
Phalcon Repositories is free software distributed under the terms of the MIT license., (*33)