Categories
programming

PHP Exceptions

Example:

  1. exception is thrown
  2. following code is not executed
  3. PHP looks for catch block
  4. if catch block is not found, fatal error is issued with Uncaught Exception message

Solution:

  1. try – a function using an exception should be on a “try” block
  2. catch – a “catch” block retrieves an exception and creates an object containing the exception information
function x(){
  if(true) throw new Exception("error");
  return false;
}

try{
  x();
} catch (Exception $e){
  echo $e->getMessage();
}

You can create custom exception class that inheres properties from PHP’s exception class and add custom functions to it.

try{
  x();
} catch (Exception $e){
  throw new CustomException();
}

Categories
linux programming web server

Simple Laravel Docker setup

composer create-project laravel/laravel laravel-app
cd laravel-app
touch .docker/Dockerfile
touch .docker/vhost.conf

Content of Dockerfile:

FROM php:7.3-apache
COPY . /srv/app
COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf
RUN chown -R www-data:www-data /srv/app && a2enmod rewrite

Content of vhost.conf:

<VirtualHost *:80>
    DocumentRoot /srv/app/public
    <Directory "/srv/app/public">
        AllowOverride all
        Require all granted
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Building image:

docker build --file .docker/Dockerfile -t laravel-app .

Running container:

docker run --rm -p 8080:80 laravel-app

Source: BitPress

Categories
programming

DOMDocument i DOMXpath

<?php
$url = "https://store.steampowered.com/app/658850/";

$doc = new DOMDocument;
libxml_use_internal_errors(true);
$doc->loadHTMLFile($url);
libxml_clear_errors();

$xpath = new DOMXpath($doc);

$title = $xpath->query('//div[@class="apphub_AppName"]');
if(count($title)) echo $title[0]->nodeValue . "\n";

$price = $xpath->query('//div[@class="discount_final_price"]');
if(count($price)){
    echo $price[0]->nodeValue . "\n";
} else{
    $price = $xpath->query('//div[@class="game_purchase_price price"]');
    if(count($price)){
        echo trim($price[0]->nodeValue) . "\n";
    }
}


Categories
linux programming web server

Vagrant

Za početak:

git clone <source> ~/projekat
cd ~/projekat
composer update
git clone https://github.com/laravel/homestead.gt ~/Homestead
cd ~/Homestead
git checkout v7.4.2
bash init.sh

Zatim editujemo ~/Homestead/Homestead.yaml u nešto poput ovog:

---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/projekat
      to: /home/vagrant/code

sites:
    - map: projekat.local
      to: /home/vagrant/code/public

databases:
    - homestead

Nakon toga je potrebno dodati zapis u datoteku /etc/hosts:

192.168.10.10 projekat.local

I za kraj iz ~/Homestead direktorijuma pokrećemo virtuelnu mašinu:

vagrant up
Categories
linux programming web server

October CMS instalacija

October CMS možemo instalirati pomoću instalera, što je i preporučljiv način, a možemo i preko Kompozera:

composer create-project october/october projekat
cd projekat
php artisan october:install

Ako instalaciju vršimo preko Kompozera, onda ćemo u datoteci config/cms.php promenljivu disableCoreUpdates da postavimo na true.

Pošto ja imam običaj da projekte držim u svom home direktorijumu i da pravim simboličke linkove u /srv/http/, moraćemo da podesimo dozvole. Kao prvo i osnovno je da sebe dodam u grupu http. Nakon toga mogu ovako da podesim dozvole i da to sve manje-više radi kako treba 🙂

chown -R benke:http projekat/
chown -R http:http projekat/storage/
chmod -R ug+w projekat/

Na ovaj način mogu da menjam kod i iz Atoma i iz October CMS integrisanog editora i da nemam problema sa snimanjem dokumenata.

Categories
linux programming

PHP i mail() funkcija

PHP funkcija mail() služi za slanje mejlova eksternim programom sendmail. sendmail je jako star program koji je bio dobar za ove stvari sve dok nije otkriveno da ima znatne propuste u pogledu sigurnosti. Zbog ovakve reputacije, mnoge Linuks distribucije ga više ne uvrštavaju u svoje repozitorijume već nude alternativna rešenja. Problem nastaje u tome što, ako PHP ne nađe program sendmail na sistemu, više ne može da pošalje mejl funkcijom mail(). Stoga ova alternativna rešenja za slanje mejlova često obezbeđuju “simulirani” sendmail kako bi se funkcionisanje programa koji zavise od njega nastavilo nesmetano.

Pošto se sendmail više ne nalazi u zvaničnim Arč repozitorijumima, instaliraćemo sSMTP, pojednostavljeno rešenje za slanje mejlova putem SMTP protokola. sSMTP nije kompletan mejl server i nema mogućnost primanja mejlova već služi samo da isporuči mejl sa lokalnog računara do mejl servera a to je ono što nama treba. Plus, sSMTP je kompatibilan sa programom sendmail i pravi simbolički link /usr/bin/sendmail 🙂

lrwxrwxrwx 1 root root 5 феб 18 2017 /usr/bin/sendmail -> ssmtp

sSMTP-u je potrebno navesti kojem mejl serveru treba da šalje mejlove, koji su kredencijali i slično. Sve to se čuva u konfiguracionom fajlu /etc/ssmtp/ssmtp.conf . Primer konfiguracionog fajla:

root=postmaster
mailhub=mail.server.com:465
AuthUser=username
AuthPass=password
rewriteDomain=server.com
FromLineOverride=YES
UseTLS=YES

A log možemo da vidimo sa

journalctl -f | grep sSMTP

 

Categories
programming

PHP i Google Sheets

Ako pravimo PHP aplikaciju koji treba da čita (a i piše) iz neke Gugl tabele, evo postupka:

1. Google API Client

Treba nam Composer kako bismo instalirali Google API Client. Google API Client će nam olakšati rad sa autorizacijom i pristupom Gugl resursima. Za instalaciju je potrebno, u direktorijumu u kojem se nalazi naš projekat, kreirati sledeći composer.json fajl:

{
    "require": {
        "google/apiclient": "^2.0"
    }
}

i pokrenuti composer update. Nakon ovoga će nam se pojaviti vendor direktorijum sa svim potrebnim klasama plus autoload skriptom.

2. API Manager

Idemo na https://console.developers.google.com/apis/dashboard da kreiramo projekat. Nakon toga klik na Enable API i sa liste biramo Sheets API.

3. Credentials

Sledeći korak su kredencijali. Idemo na Credentials > Create credentials > Service account key. Biramo New service account, dajemo mu ime a kao ulogu (role) Project > Service Account Actor. Key type nam je JSON fajl koji ćemo da skinemo i spremimo negde na sigurno.

4. Permissions

Na kraju je potrebno da dodelimo dozvole za rad sa dokumentom korisniku čiji mejl se nalazi u JSON fajlu. Dozvola može da bude samo za čitanje ili i za čitanje i pisanje u zavisnosti od toga šta želimo da naša PHP aplikacija radi.

5. PHP

Primer u PHP-u za čitanje podataka iz dokumenta sa datim ajdijem, radnim listom 2017 i iz ranga ćelija A1:AH13:

<?php

require __DIR__ . '/vendor/autoload.php';

$jsonFile = "auth.json";
$spreadsheetId = 'nbg9GnVy6bckblablatruć';
$range = '2017!A1:AH';

$client = new \Google_Client();
$client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
$client->setAccessType('offline');

$fh = fopen($jsonFile, "r");
$client->setAuthConfig(json_decode(file_get_contents($jsonFile), true));
fclose($fh);

$sheets = new \Google_Service_Sheets($client);
$data = $sheets->spreadsheets_values->get($spreadsheetId, $range, ['majorDimension' => 'ROWS']);

print_r($data);

?>

Izvor: www.phillipshipley.com

Categories
programming

Laravel forme

Forme se ne nalaze u osnovnom Laravel paketu već ih je potrebno posebno instalirati komandom

composer require "laravelcollective/html":"^5.4.0"

nakon čega je u config/app.php potrebno upisati novog provajdera i nove aliase (Form i Html). Više o ovome na Laravel Collective.

Categories
programming

Laravel i SASS

Laravel dolazi zajedno sa Bootstrap CSS frejmvorkom. Svi resursi bi po pravilu trebalo da idu u resources direktorijum (a ne direktno u public) nakon čega se rekompajliraju i premeštaju u public. Tako se npr. SASS nalazi u resources/assets/sass koji se kasnije kompajlira u CSS.

Komandom

npm install

najpre instaliramo node.js zavisnosti. Da bismo kompajlirali SASS kucamo

npm run dev

Da ne bismo kod svake promene resursa morali ovo da radimo, možemo da ga pokrenemo u rezidentnom modu:

npm run watch
Categories
programming

Laravel

Laravel je PHP frejmvork baziran na MVC arhitekturi. Slede beleške iz tutorijala koje sam nedavno prošao 🙂

Instalacija

Laravel instaliramo pomoću Kompozera:

composer create-project laravel/laravel projekat

Pošto ja ne držim projekte u /srv/http direktorijumu već pravim simboličke linkove, treba obezbediti Apache-u dozvolu za pisanje u određene direktorijume:

storage/app/public
storage/logs
storage/framework/views
storage/framework/sessions
bootstrap/cache

To je najlakše uraditi komandama

chown :http putanja
chmod g+w putanja

kao root.

Kada podesimo virtuelni hosting i lokalni domen, potrebno je da u vhosts fajlu dodamo opciju AllowOverride All za naš document root, u protivnom Mod rewrite neće raditi kako treba.

Struktura fajlova

app/*.phpmodeli
app/Http/Controllerskontroleri
app/Http/Controllers/Controller.phpcore controller that extends the base controller
resources/viewsprikazi - blade template system
routesrute - web.php main route file
configconfig files
.envdatabase credentials
database/migrationsmigracije
publiccss js etc

Rute

routes/web.php je glavni ruter. Spisak ruta može da se vidi sa

php artisan route:list

Po pravilu ruta ne treba da vraća prikaz (view) već je potrebno kreirati funkciju kontrolera koja će da vrati prikaz. Primer:

Route::get('/', 'PagesController@index');//index method of Pages controller
Route::get('/about', 'PagesController@about');
Route::get('/services', 'PagesController@services');

Kontroleri

Kontroleri se nalaze u app/Http/Controllers i kreiramo ih sa

php artisan make:controller MessagesController

Nazivi kontrolera su uvek u pluralu (“Messages” u gornjem primeru). Ako na kraju komande dodamo –resource, dobijamo i sledeće (CRUD) metode:

  • index()
  • create()
  • store(Request $request)
  • show($id)
  • edit($id)
  • update(Request $request, $id)
  • destroy($id)

Modeli

Modeli se smeštaju u app direktorijum. Kreiranje modela:

php artisan make:model Message -m

Nazivi modela su za razliku od kontrolera u singularu (“Message” u gornjem primeru). Opcija -m kreira migracione fajlove u database/migrations. Za kreiranje tabela ćemo koristiti

php artisan migrate

a za interaktivni rad sa bazom možemo da pokrenemo

php artisan tinker

Iz Tinkera se izlazi sa quit. Laravel koristi Eloquent ORM“ActiveRecord implementation for working with databases”.

Podaci o konekciji sa bazom se nalaze u .env fajlu a da bismo uopšte mogli da koristimo npr. MySQL bazu, potrebno je da u php.ini uključimo pdo_mysqli.so.