ipsumlab / core
laravel utility library from ipsumlab
v1.0.21
2022-05-10 16:04 UTC
Requires
- php: >=7.0
- illuminate/auth: >=5.3.0
- illuminate/container: >=5.3.0
- illuminate/contracts: >=5.3.0
- illuminate/database: >=5.4.0
- illuminate/http: >=5.4.0
- illuminate/routing: >=5.4.0
- illuminate/support: >=5.4.0
README
What's included
- Responses
- Filterable Trait for Laravel Eloquent Models
- ResourceController
Remember to add in app.php
'providers' => [ ...
Ipsumlab\Core\Providers\ResponseMacroServiceProvider::class,
];
this will let you use
reponse()->datatable()
reponse()->error()
and reponse()->success()
ResourceController configuration
example
use Ipsumlab\Core\Http\Controllers\ResourceController;
class MyApiController extends ResourceController
{
protected $resource = MyModelResource::class;
protected $views = [
'list' => 'slug.view.list', //blade format
'create' => 'slug.view.list',
'edit' => 'slug.view.list'
];
//used in store/update method
protected $validators = [
'field1' => 'required',
'field2' => 'required|numeric'
];
// used in index
protected $relations = ['relation'];
// used in destroy
protected $relations_delete = ['relation'];
...
}
New (store, update)
You can override normal save with this implementation
public function store(Request $request){
...
$extra_data = ['somevar' => 'somevalue'];
return parent::store($request, $extra_data,
function($resource) use ($request){
//something to do after save
upload_file();
$resource->somecolumn = extra_operations($resource->id);
$resource->save();
}
);
}
Route configuration
Route::resources([
'your-api-name' => 'MyApiController',
)]
Route::get('/you-list-page', 'MyApiController@list');
Filterable Trait
example
class MyModel extends Model
{
use Filterable;
// Define these properties if you want to allow filters over certain fields
// fields used in a orWhere condition with 'like' sql operator
// values passed through $request->search
protected static $searchable = ['title', 'subtitle', 'content'];
protected static $relations_searchable = [
'relation_1' => 'title',
'relation_2' => ['title', 'subtitle', 'content'],
];
// values passed through $request->filters in key=>value format
// you can specify what operator will be used or a custom function
// by default it use a standard ->where('field', 'value') condition
protected static $filterable = [
'standard_filter' => '>=' (or 'like', 'between', 'in')
'custom_filter' => 'customFilterFunction'
];
// By default if you do not define $filterable array
// ResourceController takes $request->filters and try to add all the present field in where condition
...
public static function customFilterFunction($query, $value){
return $query->whereHas('users', function($q) use ($value){
$q->whereIn('user_id', $value);
});
}
Uploadable Trait
Actually we use Intervention\Image\ImageManagerStatic
` for image manipulation, install it if you want to use thumbnail functionality
There are some many options to customize
protected $files_directory = 'uploads';
protected $prefix = 'date';
protected $prefix_format = 'YmdHis';
protected $uglify_filename = false;
protected $id_directory = true;
protected $make_thumb = true;
Usage example: in your model put the code below
class MyModel extends Model
{
use Uploadable;
// if you want to customize protected variables
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->files_directory = 'app/public/media';
$this->id_directory = false;
}
...
}
Simple usage in a controller
$myModel = MyModel::find(1);
$myModel->upload($requet->file('myfile'), 'db_colum_where_store_filename', [$delete_old = false]);
This configuration put the files into `storage/app/public/media
directory with no model related
id
directory for example
storage/app/public/media/1/
`
Subquery Trait
example usage
$myModel->selectSub(SomeModel::getSub('attribute_to_show', 'some_table.id'), 'some_alias_name');
Query builder Macros
Remember to add in app.php
'providers' => [ ...
Ipsumlab\Core\Providers\QueryMacroServiceProvider::class,
];
example usage
$myModel->searchIn($needle,
['mymodel_attr1', 'mymodel_attr2'],
[
'mymodel_rel1' => 'mymodel_rel1_attr1',
'mymodel_rel2' => ['mymodel_rel2_attr1', 'mymodel_rel2_attr2', 'mymodel_rel2_attr3'],
]);