Laravel

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

php namespace resolver
  • Tabulke dat vzdy mnozne cislo
  • modelu jednotne cislo
  • aby ti Laravel prepojil automaticky modely s JOIN.
import-class

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()