Создать переменную в определенном шаблоне при загрузке
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
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')
}
});