1. Go to this page and download the library: Download aaronjan/housekeeper 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/ */
namespace App\Repositories\Injections;
use Housekeeper\Contracts\Injection\Basic as BasicInjectionContract;
use Housekeeper\Contracts\Injection\Before as BeforeInjectionContract;
use Housekeeper\Contracts\Flow\Before as BeforeFlowContract;
class LogTimeBefore implements BasicInjectionContract, BeforeInjectionContract
{
public function handle(BeforeFlowContract $beforeFlow)
{
\Log::alert('wow');
}
}
namespace App\Repositories\Abilities;
use App\Repositories\Injections\LogTimeBefore;
trait TimeLogger
{
public function bootTimeLogger()
{
$this->injectIntoBefore(new LogTimeBefore());
}
}
namespace App\Repositories;
use Housekeeper\Repository;
use App\Repositories\Abilities\TimeLogger;
class MyRepository extends Repository
{
use TimeLogger;
// ...
}
class ArticleRepository extends \Housekeeper\Repository
{
protected function model()
{
return Article::class;
}
public function getByName($name)
{
return $this->simpleWrap(Action::READ, [$this, '_getByName']);
}
protected function _getByName($name)
{
return $this->getModel() // this function give you an Eloquent / Builder instance
->where('name', '=', $name)
->get();
}
}
class Repository
{
public function findBook($id)
{
return Book::find($id);
}
}
use Cache;
class CachedRepository extends Repository
{
public function findBook($id)
{
return Cache::remember("book_{$id}", 60, function () use ($id) {
return parent::findBook($id);
});
}
}
class ArticleRepository extends \Housekeeper\Repository
{
protected function model()
{
return Article::class;
}
public function getByName($name)
{
return $this->simpleWrap(Action::READ, [$this, '_getByName']);
}
protected function _getByName($name)
{
return $this->getModel() // this function give you an Eloquent / Builder instance
->where('name', '=', $name)
->get();
}
}
public function getByName($name)
{
return $this->simpleWrap(Action::READ);
}
class ArticleRepository extends \Housekeeper\Repository
{
use \Housekeeper\Abilities\CacheStatically; // Adding this
//...
}
class MyBeforeInjection implements \Housekeeper\Contracts\Injection\Before
{
public function priority()
{
return 30; // Smaller first
}
// main method
public function handle(\Housekeeper\Contracts\Flow\Before $beforeFlow)
{
// In here you can get the `Action` object
$action = $beforeFlow->getAction();
// Or get the `Repository`
$repository = $beforeFlow->getRepository();
// And you can set the returns (Only in `Before Flow`)
$beforeFlow->setReturnValue(1);
}
}
class ArticleRepository extends \Housekeeper\Repository
{
// `Housekeeper` will call the `boot` method automatically with `Dependency Injection` process
public function boot()
{
$this->injectIntoBefore(new MyBeforeInjection());
}
// ...
}
trait Adjustable
{
// ...
public function bootAdjustable()
{
$this->injectIntoBefore(new ApplyCriteriasBefore());
}
// ...
}
use Housekeeper\Action;
class ArticleRepository extends \Housekeeper\Repository
{
public function getArticlesByAuthorId($authorId)
{
return $this->simpleWrap(Action::READ);
}
protected function _getArticlesByAuthorId($authorId)
{
return $this
->applyWheres([
['author_id', '=', $authorId],
])
->get();
}
public function getArticlesBySameAuthor($articleId)
{
return $this->simpleWrap(Action::READ);
}
protected function _getArticlesBySameAuthor($articleId)
{
$article = $this->getModel()->find($articleId, ['id', 'author_id']);
return $this->getArticlesByAuthorId($article->author_id);
}
// ...
}
class ArticleController
{
public function getRecommendForArticle(ArticleRepository $articleRepository, $articleId)
{
$articles = $articleRepository
->applyWheres([
['language', '=', 'chinese'],
])
->getArticlesBySameAuthor($articleId);
return view('article.recommend-for-article', compact('articles'));
}
// ...
}
namespace App\Repositories\Criterias;
class ActiveUserCriteria implements Housekeeper\Abilities\Adjustable\Contracts\Criteria
{
public function apply(Housekeeper\Contracts\Repository $repository)
{
$repository->whereAre([
['paid', '=', 1],
['logged_recently', '=', 1],
]);
}
}
$activeUserCriteria = new ActiveUserCriteria();
// UserRepository must used the `Adjustable` trait
$activeUsers = $userRepository->applyCriteria($activeUserCriteria)->all();
// Or you can remember this Criteria:
$userRepository->rememberCriteria($activeUserCriteria);
$activeUsers = $userRepository->all();
$femaleActiveUsers = $userRepository->where('gender', '=', 'female')->all();
// Cache is disabled by default, you have to enable it first.
$userRepository->enableCache()->all();
// This also will be cached!
$userRepository->where('age', '<', '30')->orderBy('age', 'desc')->all();
class UserRepository extends Housekeeper\Repository
{
use Housekeeper\Abilities\CacheStatically;
public function getOnlyActive() // Cached
{
return $this->simpleWrap(Housekeeper\Action::READ);
}
protected function _getOnlyActive()
{
// Every wrapped method has it's own scope, they don't interfere with each other
return $this->whereAre([
['paid', '=', 1],
['logged_recently', '=', 1],
])
->all(); // Cached too
}
}
// For inputs that we can't trust
$userRepository->guardUp()->create($request->all());
// But we can trust our internal process
$userRepository->guardDown()->create($attributes);