Laravel

Создать переменную в определенном шаблоне при загрузке

app->Http>Providers->AppServiceProvider

public function boot(): void

    {

        View::composer('404', function ($view){

            $view->with('name', 'sergey');

            $view->with('age', 36);

        });

    }

Создать ограничение запросов к странице с одного IP

app->Http>Providers->RouteServiceProvider

 public function boot(): void

    {

        RateLimiter::for('main', function (){

            return Limit::perMinute(10);

        });

    }

    Route->web

    Route::view('/404', '404')->name('404')->middleware('throttle:main');

Добавление файлов через Vite

resources/js/app

import.meta.glob([

    '../img/**',

    '../fonts/**',

]);

Templete:

<img src="{{\Illuminate\Support\Facades\Vite::asset('resources/img/404.jpeg')}}" alt="">

Отправка push сообщения с Able

Устанавливаем:

composer require ably/ably-php

Для отправки сообщения создаем событие и вставляем код:

 public function __construct(string $name, string $message)
    {
        $client = new AblyRest('VgMOEw: ..........');
        $channel = $client->channel('channel');
        $channel->publish($name, $message);
    }

в bootstrap.js

const ably = new Ably.Realtime.Promise(' key ');

await ably.connection.once('connected');

console.log('Connected to Ably!');

const channel = ably.channels.get('channel');

await channel.subscribe('greeting', (message) => {
    alert(message.data)
});

async function sendMessage(message){
    await channel.publish('greeting', message);
}

// sendMessage('data').then(()=>{
//     console.log('ok');
// });

ably.close(); // runs synchronously
console.log('Closed the connection to Ably.');

Create makro for collection:

   Collection::macro('toMyMacro', function (){
            return $this->reject(function ($value){
                return is_string($value);
            })->reduce(fn($a,$b)=>$a+$b);
        });
       $res = collect(['name', 'age', 'color', 12, 45,6, 78,9])->toMyMacro();
Collection::macro('toLocale', function (string $locale) {
    return $this->map(function (string $value) use ($locale) {
        return Lang::get($value, [], $locale);
    });
});
 
$collection = collect(['first', 'second']);
 
$translated = $collection->toLocale('es');

Passport:

Установка:

composer require laravel/passport

php artisan migrate

php artisan passport:install


config/auth.php

'guards' => [

    'web' => [

        'driver' => 'session',

        'provider' => 'users',

    ],

    'api' => [

        'driver' => 'passport',

        'provider' => 'users',

    ],

],

Хеширование секрета клиента

App\Providers\AuthServiceProvider

boot

Passport::hashClientSecrets();

Время жизни токенов

public function boot(): void

{

    Passport::tokensExpireIn(now()->addDays(15));

    Passport::refreshTokensExpireIn(now()->addDays(30));

    Passport::personalAccessTokensExpireIn(now()->addMonths(6));

}

Утверждение запроса

php artisan vendor:publish --tag=passport-views


Клиент размещает у себя ссылку на наш сайт http://192.168.56.6/redirect.

Он должен быть добавлен у нас в системе и при переходе клиента указать в client_id свой id.

Route::get('/redirect', function (Request $request) {

    $request->session()->put('state', $state = Str::random(40));

    $query = http_build_query([

        'client_id' => '6',

        'redirect_uri' => 'http://192.168.56.6/callback',

        'response_type' => 'code',

        'scope' => '',

        'state' => $state,

         'prompt' => 'login', // "none", "consent", or "login"

    ]);

    return redirect('http://192.168.56.6/oauth/authorize?'.$query);

});

После авторизации выполнится обратный переход с данными нашего авторизованного клиента.

Route::get('/callback', function (Request $request) {

    $state = $request->session()->pull('state');

//    throw_unless(

//        strlen($state) > 0 && $state === $request->state,

//        InvalidArgumentException::class,

//        'Invalid state value.'

//    );

//    $response = Http::asForm()->post('http://192.168.56.6/passport/user', [

//        'grant_type' => 'authorization_code',

//        'client_id' => $request->user()->id,

//        'client_secret' => 'client-secret',

//        'redirect_uri' => 'http://192.168.56.6/callback',

//        'code' => $request->code,

//    ]);

    return \Illuminate\Support\Facades\Response::json( [

          'grant_type' => 'authorization_code',

        'client_id' => $request->user()->id,

        'email'=> $request->user()->email,

        'client_secret' => 'client-secret',

        'redirect_uri' => 'http://192.168.56.6/callback',

        'code' => $request->code]);

    return $response->json();

});

Обработка ошибки 404

App\Exceptions\Handler

public function render($request, Exception $exception)

{

    if ($this->isHttpException($exception)) {

        if ($exception->getStatusCode() == 404) {

            return response()->view('errors.404', [], 404);

        }

    }

    return parent::render($request, $exception);

}

Глобальные ограничения

Если вы хотите, чтобы параметр маршрута всегда был ограничен заданным регулярным выражением, вы можете использовать этот метод. Вы должны определить эти шаблоны в методе вашего класса:patternbootApp\Providers\RouteServiceProvider


/**

 * Define your route model bindings, pattern filters, etc.

 */

public function boot(): void

{

    Route::pattern('id', '[0-9]+');

}


Явная привязка

Чтобы зарегистрировать явную привязку, используйте метод маршрутизатора, чтобы указать класс для данного параметра. Вы должны определить явные привязки модели в начале метода вашего класса:modelbootRouteServiceProvider


use App\Models\User;

use Illuminate\Support\Facades\Route;

 

/**

 * Define your route model bindings, pattern filters, etc.

 */

public function boot(): void

{

    Route::model('user', User::class);

 

    // ...

}

Необязательные параметры

Иногда может потребоваться указать параметр маршрута, который не всегда может присутствовать в универсальном коде ресурса (URI). Вы можете сделать это, поставив метку после имени параметра. Убедитесь, что для соответствующей переменной маршрута задано значение по умолчанию:?

Route::get('/user/{name?}', function (?string $name = null) {

    return $name;

}); 

Route::get('/user/{name?}', function (?string $name = 'John') {

    return $name;

});

Определение ограничителей скорости

RateLimiter::for('uploads', function (Request $request) {

    return $request->user()->vipCustomer()

                ? Limit::none()

                : Limit::perMinute(100)->by($request->ip());

});


RateLimiter::for('login', function (Request $request) {

    return [

        Limit::perMinute(500),

        Limit::perMinute(3)->by($request->input('email')),

    ];

});

Route::middleware(['throttle:uploads'])->group(function () {

    Route::post('/audio', function () {

        // ...

    });

 

    Route::post('/video', function () {

        // ...

    });

});


X-CSRF-ТОКЕН

В дополнение к проверке CSRF-токена в качестве параметра POST, промежуточное ПО также проверяет заголовок запроса. Вы можете, например, сохранить токен в HTML-теге:App\Http\Middleware\VerifyCsrfTokenX-CSRF-TOKENmeta

<meta name="csrf-token" content="{{ csrf_token() }}">

Затем вы можете указать библиотеке, такой как jQuery, автоматически добавлять маркер ко всем заголовкам запроса. Это обеспечивает простую и удобную защиту CSRF для приложений на основе AJAX, использующих устаревшую технологию JavaScript:

$.ajaxSetup({

    headers: {

        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')

    }

});

Признаки "плохого кода"

Кратко рассмотрим 12 признаков, когда код можно улучшить: 1. Duplicated Code  — иногда повторяющийся код не всегда несет в себе пользу. Выде...