PHP code example of vasichmen / laravel-foundation

1. Go to this page and download the library: Download vasichmen/laravel-foundation 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/ */

    

vasichmen / laravel-foundation example snippets


use Laravel\Foundation\Abstracts\AbstractAppServiceProvider;

class AppServiceProvider extends AbstractAppServiceProvider
{
    protected array $modelList = [
        User::class, //репозитории подключатся по классам моделей из App\Repositories как singleton, будут доступны через app(UserRepository::class)
    ];

    protected array $serviceList = [
        AuthService::class,  //сервисы подключаются как singleton и доступны через app(AuthService::class)
    ];

}

use Laravel\Foundation\Abstracts\AbstractBasicAuthMiddleware;

class ExternalApiAuthMiddleware extends AbstractBasicAuthMiddleware
{
    protected string $key = 'external_api';

}

'external-auth' => ExternalBasicAuthMiddleware::class,

 'basic' => [
        'external_api' => [
            'user' => env('EXTERNAL_API_USER', 'user'),
            'password' => env('EXTERNAL_API_PASSWORD', 'password'),
        ],
    ],

Route::prefix('external')
    ->middleware('external-auth')
    ->group(function () {
        Route::get('test-user-token', [AuthController::class, 'testUserToken']);
    });


return [
    SystemStereotypeEnum::class => [
        SystemStereotypeEnum::Typical->value => 'Типовая система',
        SystemStereotypeEnum::Real->value => 'Реальная система',
    ],
]

 SystemStereotypeEnum::Typical->trans($args);

$this->alterEnum('subscriptions', 'type', ['tag','space','user']);

$this->makePartitionedTable('materials', 100, function (Blueprint $table) {
            $table->string('name');
            $table->uuid('owner_id');
            $table->uuid('author_id');
            $table->timestamps();

            $table->foreign('owner_id')->references('id')->on('users');
            $table->foreign('author_id')->references('id')->on('users');
        });

use App\DTO\Requests\RefreshTokenRequestDTO;
use Laravel\Foundation\Abstracts\AbstractRequest;


class RefreshTokenRequest extends AbstractRequest
{
    use \Laravel\Foundation\Traits\RequestSortable;

    protected ?string $dtoClassName = RefreshTokenRequestDTO::class;
    
    public function rules()
    {
        return [
            'some_long_parameter' => '

use Laravel\Foundation\Abstracts\AbstractDto;

class RefreshTokenRequestDTO extends AbstractDto
{
    public string $someLongParameter;
    public array $sort;
    public int $page;
    public int $perPage;
}

class RefreshTokenRequestDTO extends AbstractDto
{
    protected function parseData(array $data, bool $throwIfNoProperty = true): void
    {
        parent::parseData($data, false); 
    }
}

class User extends \Laravel\Foundation\Abstracts\AbstractModel
{
 ...
 
   // Можно переопределить метод сброса кастомного кэша
   // Метод вызывается при обновлении/удалении модели, в нем надо определить сброс кэша по кастомным тегам 
   public static function invalidateCustomCache(AbstractModel $user): void 
    {
        /** @var User $user */
        Cache::tags(['tag_1','tag_2'])
            ->forget(self::getCacheKey('some key data'));
    }
}



$result = $abstractModel
            ->cacheFor(config('cache.ttl'))
            ->where('feed_id',$feedId)
            ->get();




$result = $abstractModel
            ->cacheFor(config('cache.ttl'))
            ->cacheTags([self::getCacheTag('feeds', $feedId)]) //устанавливаем кастомные теги
            ->cacheKey(self::getCacheKey($feedId)) //задаем ключ кэша 
            ->where('feed_id',$feedId)
            ->get();

UserRepository::query()
    ->filters(['code'=>'code_1','count'=>1])
    ->query('query string',['column1','column2']) //поисковый запрос по определенным столбцам 
    ->cacheFor(config('cache.ttl')) //длительность хранения кэша
    ->orderBy(['name'=>'asc','id'=>'desc'])
    ->with(['roles']) //загрузка отношений
    ->withCount(['subscribers']) //получение числа связанных объектов
    ->get(); //полная выборка в виде Collection
    
 UserRepository::query()
    ->filters(['code'=>'code_1', 'count'=>1]) //применение фильтров
    ->orderBy(['name'=>'asc',]) //сортировка по полю name по возрастанию
    ->limit(10) //10 элементов на странице
    ->offset(1) //первая страница
    ->paginate() //Возвращается LengthAwarePaginator

UserRepository::query()
    ->fromGetListDto($someGetListDto) //установка настроек из заданного объекта GetListRequestDTO
    ->paginate();

use Laravel\Foundation\Abstracts\AbstractResource;

class UserResource extends AbstractResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'login' => $this->login,
            ...$this->getEnum('information_processed')
            ...$this->getRelation('roles', RoleResource::class),
        ];
    }
}

return new DataResultPresenter(
            'bookmarks' => BookmarkResource::collection($bookmarkCollection),
        );

  return new DataResultPresenter([
            'token' => new TokenResource($token),
            'user' => new UserResource($user),
        ]);

return new PaginatedDataPresenter($lengthAwarePaginatedData, null, SomeModelResource::class);