Novy projekt postup
composer create-project --prefer-dist laravel/laravel nazov_priecinka
Nova https://nova.laravel.com/docs/4.0/installation.html
create database
set .env file
php artisan migrate
add scripts to json
add mamp host
nova settting zmen /nova na / a v routes zmen / na /welcome
Vseobecne
composer create-project --prefer-dist laravel/laravel nazov_priecinka // install
php artisan - vypiše prikazy
php artisan make / php artisan make --help - vypise prikazy make + help
php artisan help migrate / php artisan migrate --help , php artisan help serve ... - help pre migrate, serve ...
php artisan serve - spusti server
php artisan route:list - zoznam stranok
php artisan make:controller PagesController -- vytvori subor PagesController
route cez web.php – konroluje smerovanie a smeruje na cotrolleri
controller – vytahuju data z databázy a vytvára premenné
model – na vytvaranie funkcii
views – vytvorene htmlka – funkcia view(nazov html stranky vo views ) vrati stranku + layots pre vytvorenie šablón
Frontend kód teraz píšeš do adresára /resources.
do app.php (vyhladaj si cez ctrl+P) mozeme pridavat providers a allies, po pridani doplnkov moze byt potrebne pridat pre spustanie
routes/web – zoznam adries
app/https/controlles/
Pre rýchle vytvorenie stránky môžete použí https://www.alpinetoolbox.com/examples/ kde si nájdete rôzne šablóny
funkcie v laraveli
dd() - die and dump alebo @dump()
view('welcome') - vrati sablonu s nazvov welcome z resources/views
class="{{ Request::segment(1) }}" - vytvori class pre kazdu podstranku podla url
Doplnky pre Visual Studio code:
laravel blade snippets
laravel artisan
Databazy
.env – obsahuje udaja na databazu
composer require laravel/helpers
composer require laravel/ui
php artisan ui vue --auth - vytvori autentifikaciu (adresar Controller/auth) php artisan make:auth - stara verzia laravelu
php artisan migrate - vytvori tabulky v databaze, v tomto pripade prihlasovacie lebo su zadane udaje na migraciu v priecinku
databse/migrate
/* nezabudni zapnut laragon alebo mamp :) */
npm install //potrebne tiez spustit npmnp
npm run dev
npm run build
npm run dev - kombinuje všetky vaše komponenty Vue a ďalšie súbory JavaScript do kombinovaného súboru vhodného pre prehliadač.
npm run watch - robí to isté, ale potom zostane aktívny a „sleduje“ aktualizácie vašich súborov .vuea .jssúborov. Ak zistí zmenu, znova vytvorí súbor vhodný pre prehliadač, takže stačí obnoviť stránku.
Rozdiel medzi dev a watch je v tom, že devpríkaz skompiluje kód a potom skončí, zatiaľ čo watchpríkaz skompiluje komponenty, potom sleduje súbory a prekompiluje, keď sa jeden z nich zmení. Nie je teda potrebné vypínať a zapínať server pri zmene.
Ak používate Vite stačí vám príkaz npm run dev ktoráý tiež zaznamenáva zmeny
npm run build - pripravy subory do produkcie do adresara public
Route:: - znamena ze sa ma pouzit zdroj z priecinku route, preto musim na zaciatok zadat namespace a cesta k adresaru
Prestala mi fungovat databáza a vybehoval mi error pri prihlaseni Error (HY000/1045): Access denied
zmenil som port v laragon/bin/mysql/mysql5.7/my.ini ako je to na tomto videu https://www.youtube.com/watch?v=o56L2He3YbA
v laraveli som v .enc zmenil port a heslo
nakoniec ale vlastne stacilo prihlasit sa do dtabazy z menom root a bez hesla 😀
Šablóny
//takto dostanes obsah a sidebar do sablony
<main id="app">
@yield('content')
</main>
<aside>
@yield('sidebar')
</aside>
// takto si vytvoris stránku ktora obsahuje sekciu content a sidebar a zobrazi sa v sablone, musis vsak navrchu pridat rozsirenie
@extends('master')
@section('content')
<h1>homepage</h1>
<p>
ja som homepage
</p>
@endsection
@section('sidebar')
<p>sidebar, lalala</p>
@endsection
Cache prikazy
php artisan route:cache
php artisan route:clear
Vytahovanie dat z databazy
\DB::table('technologies')->get() vytiahne data priamo z databazy bez vytvarania controllerov
//\DB::table('users')->latest()->get(),
return Post::all(); -- vytiahnutie z databazy z controllera Post
return Post::first(); / Post::all()->first; -- prvy
'feeds' => Feed::get()->sortBy('last_call')->reverse(),
return Post::all()->pluck('title'); // iba nazov
return Post::with('comments')->latest()->limit(2)->get(); // ak mám prepojené tabulky v databaze mozem vytiahnut rovno aj komentáre priradené k príspevkom a zoradené od najnovsieho
Post::with('comments', 'user')->latest()->get()
$post->load('comments', 'comments.user');
viac na https://laravel.com/docs/9.x/queries
use App\Models\Post; // na zaciatok
v posts skryjem niektore hodnoty takto:
protected $hidden = [
'text', 'updated_at'
];
Vo Visual Studio Code mozeme pouziť PHP Namespace Resolver pre jednoduchšie doplnanie
- Tabulke dat vzdy mnozne cislo
- modelu jednotne cislo
- aby ti Laravel prepojil automaticky modely s JOIN.
Vytváranie tabuliek cez migrate
php artisan make:migration create_posts_table - vytvori tabulku s nazvom posts
php artisan make:migration add_name_to_posts --table posts // prida stlpec do tabulky posts
php artisan make:migration create_comments_table - vytvori tabulku s nazvoom comments
php artisan make:model Post - vytvori model "Posts" pre databazu
php artisan make:migration:schema create_posts_table --schema="user:id:integer:unsigned, title:string(200), text:text, slug:string(200)" // vytvori tabulku s nazvom posts s vyplnenymi hodmotami a model s nazvom post
php artisan migrate - spustis
php artisan migrate --path=database/migrations/2023_02_07_095950_create_reports_table.php // spsutis konkretnu migraciu
php artisan migrate:refresh --path=database/migrations/2023_03_02_193029_create_posts_table.php // refresh
php artisan migrate:rollback --path=database/migrations/2023_03_24_094606_create_reviews_table.php // rollback/drop table
pre znova spustenie vytvorenia tej istej tabulky jej staci upravit nazov / cas vytvorenia
php artisan migrate:refresh --seed -- premaze databazu a znova spusti seedy
$table->uuid('id')->primary();
$table->boolean('allow_billing_invoice')->default(false);
$table->string('title', 200)->default('Predvolena hodnota')
$table->text('text')->nullable() // moze byt prazdne
->unique() // unikatna hodnota
// prepoji tabulku posts s tabulkou user
public function user()
{
return $this->belongsTo('App\Models\User');
}
// prepoji tabulku user s tabulkou posts
public function posts()
{
return $this->hasMany('App\Models\Post');
}
tak získaš prístup k $user->posts a $post->user
// usporiada podla najnovsich
return $this->hasMany('App\Models\Comment')->latest();
return $this->hasMany('App\Comment')->orderBy('id', 'DESC');
return $this->hasMany('App\Comment')->orderBy('text', 'ASC'); // abecedne
Vyplnanie databazy
php artisan make:seeder PostsTableSeeder - vytvorim si seeder pre posts
php artisan make:factory PostFactory --model=Post -- vytvorim si factory (vzor vyplnania pre posts) naviazany na model Post
php artisan db:seed - spusti ulohy
ak nemám definované timestamps v tabulke mozem ich v modeli zakázat aby mi nevyskakoval error
public $timestamps = false;
1. do DatabaseSeeder vlozim cestu pre Postseeder $this->call(PostsTableSeeder::class); // odkaze na novy seeder post
2. do PostTableSeeder vlozim \App\Models\Post::factory(5)->create(); pre vytvorenie 5 posts
3. /do PostFactory definujem ako sa maju vytvarat posts
$title = fake()->words(4, true);
return [
'user_id' => 1,
'title' => ucfirst($title),
'slug' => str_slug($title),
'text' => fake()->paragraphs(5, true),
];
zoradenie dat z databazy
Post::all(),
Post::latest('id')->get(), // zoradenie od najmladsich alebo oldest
Post::latest()->get(), // pri prazdnom podla datumu vytvorenia
$table->timestamp()->useCurrent() - aktualny cas
$table->bigInteger('vypredane'); - normalne cislo
->take(6) - pre vybratie iba 6 zo vsetkych (po get)
->limit(6) - pred get()
->sortByDesc('last_call') - zoradenie
Escapovanie
{!! !!} - namiesto {{ }} napr {!! $table !!}, ak chcem vypnut escaping (automaticky sa totiz v nich vypina js a html)
nl2br() - prida vytiahnutym datam <br>
@{{pre vue}}
{{ str_plural('comment', $post->comment->count) }}
Autoamticke vytvorenie controllora
php artisan make:controller PostController --resource --model=Post -vytvori controller pre posts, nasledne staci do predpripraveneho controllera doplnit ake hodnoty ma vraciat
php artisan make:controller v1/TeamApiController --resource --model=Team
php artisan route:list // skontrolujes si adresy ktore vytvoril
@include('posts.articles', ['type' => 'listing']) - nastavim si class ku
.content+footer.meta>a.author+time -> staci zapisat takto vo VS a vytvori mi meta tagy aj s clasmi
Formátovanie dátumov cez carbon
composer require nesbot/carbon
composer install
https://carbon.nesbot.com/
Užitočné
Podla app.blade.php vkladať skripty
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.bunny.net/css?family=Nunito" rel="stylesheet">
<!-- Scripts -->
@vite(['resources/sass/app.scss', 'resources/js/app.js'])
@push('head')
<!-- Styles -->
<link href="{{ asset('css/pizza.css') }}" rel="stylesheet">
<!-- Scripts -->
<script src="{{ asset('js/components/pizza.js')}}"></script>
@endpush
// cerpanie z config subor
<title>{{ config('app.name', 'Laravel') }}</title>
// vytvaranie linkov
<a class="navbar-brand" href="{{ url('/') }}">
@if($post->tags)
namiesto @if a @foreach mozeme pouzit aj @forelse
Laragon ponúka tieto moznosti vytvorenia laravel projektu
AutoCreateDatabase=true
Cached=true
# Laravel
Laravel=composer create-project laravel/laravel %s --prefer-dist - vytvori novy projekt laravel s nazvom %s aj s databazou
Laravel (zip)=https://github.com/leokhoa/quick-create-laravel/releases/download/5.6.21/laravel-5.6.21.7z
### Laravel dev-develop=composer create-project laravel/laravel %s dev-develop
### Laravel 4=composer create-project laravel/laravel %s 4.2 --prefer-dist
### Lumen=composer create-project laravel/lumen %s --prefer-dist
Prihlasovanie
Auth::user();
Auth::user()->name
@guest
zobrazi neprihlasenym
@endguest
@auth
//zobrazi ak si prihlaseny
@endauth
// pridat do controllera na zaciatok ak chcem umoznit akciu iba prihlasenemu uzivatelovi
public function __construct()
{
$this->middleware('auth');
}
Ako pridať overenie emailovej adresy
Validácia
//request ktory posielam do funkcie mozem zvalidovat
$validator = $request->validate([
'text'=>'required',
'post_id'=>'reguired|integer',
]);
if( $validator->fails() ){
return back()->withInput()->with('flash' , 'Fail')->withErrors($validator);
}
// vypisanie chyby
@if ($errors->any())
<ul class="notification is-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
Route
Auth::routes();
Route::get('/projekty', [App\Http\Controllers\ProjectController::class, 'index'])->name('projekty');
Route('projekty') -- cesta
return Response::json([ // alebo response()->json([])
'message' => 'error',
'code' => '1'
]) // pre vratenie JSONU
Odosielanie formulára
@csrf – musis pridat do kazdeho formulara aby preslo overenie
a tiez do modelu pridat ktore data mozu prechadzat do databazy:
protected $fillable = [ // povolene
'text', 'user_id', 'updated_at', 'created_at', 'project_id'
];
protected $guarder = [ //chranene / blacklist
'id', 'is_admin'
];
Data v laraveli su ulozene ako kolekcia a mozeme na nich pouzit rozne php metody napr. $data->reverse() obroci poradie dat.
VUE
Ak si chcem preposlat kolekciu data z laravelu do vue pouzijem (:) aby mi to prislo ako json, zápis :comment-data="{{ $comment }}"
tak isto vo vue componente potom musim pouzit dvojbodku pre vlozenie hodnoty :value="client.id"
Registracia vlastnej funkcie
- – vytvor si v subore app Support/helpers.php do ktoreho si napis funkciu a pouzi if ( !function_exists(‘short_text’) ){
- – pridaj do composer.json autoload za psr-4
"files": [
"app/Support/helpers.php"
]
composer dump-autoload
isset {{ isset($name) ? $name : ‘Default’ }}
Soft Deletes
pridat v modeli:
use Illuminate\Database\Eloquent\SoftDeletes;
use SoftDeletes
pridat funkciu archive() do taskController a do web root
bud vytvorit novu tabulku s migraciou alebo pridat do povodnej tabulky $table->softDeletes(); a znova ju pregenerovat
php artisan make:migration add_soft_deletes_to_projects_table --table=projects
Route::delete('/clients/{client}', [App\Http\Controllers\ClientController::class, 'destroy'])->withTrashed();
Route::get('/clients/archive', [App\Http\Controllers\ClientController::class, 'archive'])->name('clients-archive');
public function archive()
{
//return task::all();
return view ('tasks.archive', [
'archive' => task::onlyTrashed()->orderBy('deleted_at', 'desc')->get(),
]);
}
Error pages
vytvory error stranky vo views
php artisan vendor:publish --tag=laravel-errors
php artisan down - zapnte na stranke mod udrzby(vypne ju)
php artisan up- znova zapne
Maily
https://dev.to/shanisingh03/how-to-send-email-in-laravel-9–13db
php artisan make:mail TestEmail - prida zlozku App\mail
use App\Mail\TestEmail;
use Illuminate\Support\Facades\Mail;
$to ['email1','email2']
Mail::to($to)->send(new TestEmail($mailData));
Format datumu:
// date('d-m-Y', strtotime($user->from_date));
function convertDate ( $date, $format = 'd-m-Y') {
return date($format, strtotime($date));
}
Spatie Roles and Permission
https://spatie.be/docs/laravel-permission/v5/basic-usage/basic-usage
https://www.youtube.com/watch?v=Bze4dd4WWYU
'user_id' => User::role('user')->get()->random()->id,
'user_id' => User::hasRole('user')->get()->random()->id,
{{Auth::user()->can('edit tasks')}}
{{Auth::user()->getRoleNames() }}
{{Auth::user()->can('edit tasks')}}
$meno->getPermissionNames()
$meno->getRoleNames()
{{ $meno->givePermissionTo(['read tasks']) }}
'user' => Role::all(),
'messages' => Message::all(),
'admins'=> User::role('admin')->get(),
'roles'=> Role::all(),
Sections skillmea
Defining A Blade Layout
{{ Request::segment(1) }} - vypise nazov posledneho adresara v url
@section('heading')
This is the master sidebar.
@show // @show pre automaticky zobrazenie / pri @stop musis najprvy yeldnut
@section('heading')
<h2> Ja som special zobrazim sa namiesto headingu </h2>
@stop // zakáze zobrazenie hlavneho headingu v master sablone
@parent - pridavak hlavnemu headingu dalsi content specialne na danej podstranke
Using A Blade Layout
@section('title', 'Page Title')
@section('sidebar')
@@parent
<p>This is appended to the master sidebar.</p>
@stop
@section('content')
<p>This is my body content.</p>
@stop
SPATIE Laravel-medialibrary
https://spatie.be/docs/laravel-medialibrary/v10/installation-setup
https://spatie.be/docs/laravel-medialibrary/v10/basic-usage/retrieving-media
https://www.youtube.com/watch?v=E7dq7KMgQn0&ab_channel=LaravelPackageTutorial
https://www.youtube.com/watch?v=FeIYurxiggU&ab_channel=Laraveller
getMedia();
$yourModel->getFirstMediaUrl();
How to use Try Catch Exception in Laravel App?
// used in clientController
use Exception; /add
try {
$user = User::find($input['id']);
$client = Client::latest()->get();
} catch (Exception $e) {
$message = $e->getMessage();
var_dump('Exception Message: '. $message);
$code = $e->getCode();
var_dump('Exception Code: '. $code);
$string = $e->__toString();
var_dump('Exception String: '. $string);
exit;
}
Laravel Sanctum – API Auth with Sanctum
do Auth pre registráciu usera som pridal ‘token’ => Auth::user()->createToken(‘authToken’)->plainTextToken,
->middleware(‘auth:sanctum’); — overi autorizaciu cez token
https://devdocs-fr.github.io/laravel/7.x/sanctum
https://laravel.com/docs/9.x/sanctum
https://github.com/chunratha/Ratha-Project/blob/main/laravel-sanctum
https://www.youtube.com/watch?v=pbpKWHYRcO4
https://dev.to/shanisingh03/laravel-api-authentication-using-laravel-sanctum-edg
https://youtu.be/yLeSxmCkc9E
Accessors & Mutators
// Accessors - upravia pri vytahovani z DB
public function getCreatedAtAttribute($value) // pre create_at
{
return date('d-m-Y', strtotime($value));
}
public function getEmailVerifiedAtAttribute($value) // pre email_erified
{
return date('d-m-Y', strtotime($value));
}
//Mutators - upravia pri vkladani do DB
public function setTitleAttribute($value) // pre title
{
$this->attributes['title'] = ucfirst($value); //ucwords ,
}
public function setDescriptionAttribute($value)
{
$this->attributes['description'] = ucfirst($value);
}
Rozšírenie cez Eloquent Accessors a pridanie mutators
// rozšírenie cez Eloquent Accessors
public function getDateTimeAttribute()
{
return date('d-m-Y', strtotime($this->created_at));
}
public function getTaskUserNameAttribute()
{
return $this->User->name;
}
//Mutators
public function setTitleAttribute($value)
{
$this->attributes['title'] = ucfirst($value); //ucwords ,
}
public function setDescriptionAttribute($value)
{
$this->attributes['description'] = ucfirst($value);
}
/ mohol by som cez muttator napr. aj pridat slug stale ak vytvorim post
Funkcie v modeli
// v model User
public function isAdmin(){
return $this->role === 'admin'; // $this == model
}
//v controlleri UserController
$user = \App\User::find(2) // -- najde usera s id 2
$user = \Auth::user(); // -- prihlaseny user
if( $user->isAdmin(
))
URL::current - aktualna adresa
UUID a ULID
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use HasUuids;
Preklady
preklady – resources – lang – en / skopirovať a premenovať na sk
v app.php zmenit jazyk/local na sk
použitie vo views {{ trans(‘auth.login’) }}
pouzitie v php trans(‘auth.login’)
Práca so súbormi / import do excelu
package https://github.com/SpartnerNL/Laravel-Excel
https://docs.laravel-excel.com/3.1/exports/
// package
php artisan make:export IdeasExport --model=Idea
v modeli Idea pridat funkciu export
ROUTE WEB
// package
Route::get('exportideas', [IdeaController::class, 'export']);
// nefungovalo
//Route::get("export2", function () {
// Excel::create('output', function ($excel){
// $excel->sheet('zosit', function ($sheet)
// {
// $sheet->with(Idea::all());
// });
// })->export('xls');
//});
// ukladanie suborov
Route::get("export", function (){
$file_path = storage_path('export.csv');
$data = Idea::all()->toArray();
$output = fopen($file_path, 'w');
foreach ($data as $row){
fputcsv($output, $row);
}
fclose($output);
return response()->download($file_path);
// echo Storage::put('exportfile.txt', 'contect of title');
// echo Storage::get('exportfile.txt');
// return response()->download(
// storage_path('app\exportfile.txt')
// );
// echo Storage::append('exportfile.txt', 'appendnute');
// echo Storage::delete('exportfile.txt');
// echo storage_path('exportfile.txt');
});
Uzitocne Funkcie
Zmena udajov usera
$user = User::find(4); $user = User::where('name', 'admin') // User::whereName('admin');
$user->email = 'info.pppcreative@gmail.com';
$user->save();
$user = Auth::user();
$user->last_login = date('Y-m-d H:i:s');
$user->save();
Update priamo cez databazu
DB::table('users')->where('name', Auth::user()->name)->update(['last_login'=>date('Y-m-d H:i:s')]);
DB::table('projects')->insert(['project'=>'moj projekt'])
Vytvorenie noveho
// $user = new User;
// $user->name = 'skuska';
// $user->email = 'skuska@skuska.com';
// $user->password = bcrypt('hesielko');
// $user->save();
pripojenie a odpojenie tagu k postu
$post->tags()->save($tag);
$post->tags()->detach(5);
$post->tags()->sync([2,4,6]) // prida postu tagy s id 2,4,6 a odobere tie ktore ta boli
prikazy
php artisan tinker // ukoncuje sa s exit // consola pre backend
php artisan migrate:rollback // vrati DB do povodneho stavu pred migraciou teda pouzije sa funkcia drop / down
php artisan migrate:reset // vymaze vsetko z db
funkcie
findOrFail($id)
word_limiter($this->text, 60 ) // this pouzije model
filter_url() // url
add_paragraphs() // prida paragraphy
e() - eccapovanie kodu
{!! !!} // ztusi escapovanie
?: // ??
Auth::user->posts()->create($request->all() )
\Auth::check
make:request SavePostRequest -- mozem si vytvorit vlastny Request ktory overi udaje
old()