PHP Composer – some commands and tricks

Directory structure:

|   composer.json
|   composer.phar
|   index.php
|
+---app
|   +---controller
|   |       Home.php
|   |
|   \---model
|           FirstDb.php
|
\---vendor
    |   autoload.php
    |
    \---composer
            autoload_classmap.php
            autoload_namespaces.php
            autoload_psr4.php
            autoload_real.php
            autoload_static.php
            ClassLoader.php
            LICENSE

1. Standard case – with namespaces

root/composer.json

{
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

root/app/controller/Home.php

<?php
namespace App\Controller;

class Home{

	public function index(){
		echo "Hello from Home->Index!";
	}
}

root/app/model/FirstDb.php

<?php
namespace App\Model;

class FirstDb{
	public function db(){
		echo "Hi from first DB";
	}
}

root/index.php

<?php 
use App\Controller\Home;
use App\Model\FirstDb;

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

$h = new Home();
$fdb = new FirstDb();

echo $h->index()."\n";
$fdb->db();

2. Without namespaces

root/composer.json

{
    "autoload": {
        "psr-4": {"": ["app/controller", "app/model"]}
    }
}

root/app/controller/Home.php

<?php

class Home{

	public function index(){
		echo "Hello from Home->Index!";
	}
}

root/app/model/FirstDb.php

<?php

class FirstDb{
	public function db(){
		echo "Hi from first DB";
	}
}

root/index.php

<?php 
require_once __DIR__ . '/vendor/autoload.php';

$h = new Home();
$fdb = new FirstDb();

echo $h->index();
$fdb->db();

3. Mix usage

root/composer.json

{
    "autoload": {
        "psr-4": {
            "": "app/"
        }
    }
}

root/app/controller/Home.php

<?php
namespace controller;

class Home{

	public function index(){
		echo "Hello from Home->Index!";
	}
}

root/app/model/FirstDb.php

<?php
namespace model;

class FirstDb{
	public function db(){
		echo "Hi from first DB";
	}
}

root/index.php

<?php 
require_once __DIR__ . '/vendor/autoload.php';

$h = new controller\Home();
$fdb = new model\FirstDb();

echo $h->index();
$fdb->db();

4. Composer addPsr4() without cnahge composer.json – dynamically add classes

root/composer.json

{
    "name": "some/test",
    "require": {}
}

root/app/controller/Home.php

<?php
namespace App\Controller;

class Home{

	public function index(){
		echo "Hello from Home->Index!";
	}
}

root/app/model/FirstDb.php

<?php
namespace App\Model;

class FirstDb{
	public function db(){
		echo "Hi from first DB";
	}
}

root/index.php

<?php 
use App\Controller\Home;
use App\Model\FirstDb;

$loader = require __DIR__ . '/vendor/autoload.php';
$loader->addPsr4('App\\', 'app/');

$h = new Home();
$fdb = new FirstDb();

echo $h->index()."\n";
$fdb->db();

5.Some important commands

Some important commands:

To initially install the defined dependencies:
php composer.phar update

to make sure the vendor directory is up in sync with your composer.lock file
php composer.phar install

To update to the latest versions
php composer.phar update

After adding the autoload field, you have to re-run this command:
php composer.phar dump-autoload

php composer.phar dump
calls composer dump-autoload.

how to create a composer.json by hand
php composer.phar init

To list all of the available packages
php composer.phar show

It will replace your composer.phar with the latest version:
php composer.phar self-update


all directories or files to search for classes:
{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}
Wildcards (*) are also supported in a classmap paths, and expand to match any directory name:
{
    "autoload": {
        "classmap": ["src/addons/*/lib/", "3rd-party/*", "Something.php"]
    }
}


if your package includes PHP functions that cannot be autoloaded by PHP:
{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}




HELP
=========================
to see the complete list of commands
composer list

--help combined with any of those can give you more information

Share and Enjoy !

Shares

PHP Captcha Generator – с възможности за настройка

В различните ми проекти с PHP съм ползвал различни Captcha генератори, за да се пазя от спамери и ботове. Но винаги нещо ми е липсвало или са били прекалено грамадански за семплите ми нужди. За това си написах един клас, който лесно да мога да интегрирам в проектите. Всъщност идеята беше друга – да направя голямо количество предефинирани капчи и да ги набутам в SQLite файл, така скоростта на зареждане става муцка. Това и направих. Но така или иначе написах голяма част от кода, та реших да направя и един самостоятелен клас. В последствие, ако ми текне музата, мога да напиша и туториал и със сесии да демострирам, как използвам капчата в реални условия.

Моя Captcha Generator има няколко готини опции за настройка:

  • използване на множесвно TTF-шрифтове. Аз ползвам такива от https://fonts.google.com
  • настройка големината на шрифта
  • настройка на отстоянието между отделните знаци
  • дефиниране на различни ъгли за наклон на знаците
  • дефиниране на собствен масив от знаци

Captcha generator класа с много простичко примерче може да се изтегли от тук:
https://blog.nediko.info/examples/captcha_generator/CaptchaGen_PHP.zip

А ето и един видео урок, който направих набързо, за да е ясно как се настройва генератора:


Share and Enjoy !

Shares

PHP XPath command line graber – for Windows and Linux

Написах скромно скриптче на PHP за прилагане на XPath изрази през командния ред. Скрипта изисква инсталиран Lynx или, ако се ползва под Windows трябва да се постави Lynx в същата директория. Готиното на това програмче е, че не се интересува дали има грешки в страницата.

<?php
if ($argc != 3 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
 
This is a XPath extractor.
 
  REQUIRES:
  "lynx" to be installed!
 
  USAGE:
  <?php echo $argv[0]; ?> <site> <xpath>
 
  EXAMPLE:
  <?php echo $argv[0]; ?> http://site.com/some_page.html "//a[contains(@href,\"?rec\") and not(contains(@href,\"comment\"))]/@href"
  --------------------
 
  With the --help, -help, -h,
  or -? options, you can get this help.
 
<?php
} else {
$site=$argv[1];
function get_cont($url){
$c = `lynx -source $url`;
return $c;
}
$html = get_cont($site);
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate($argv[2]);
for ($i = 0; $i < $hrefs->length; $i++) {
	$bb = $hrefs->item($i)->nodeValue;
	print "$bb\n";
}
}
?>

Начин на употреба:

php xpath.php site.com/some_page.html "//a[contains(@href,\"?rec\") and not(contains(@href,\"comment\"))]/@href"

Остава да успея и да го компилирам :). За сега съм пробвал с Bambalam compiler, Roadsend, phc и още няколко по-незнайни емдера и компилатора, но … дърво от всякъде. Все пак, ако си имате инсталиран php и Lynx си работи идеално.
Lynx за Winblowz може да се ползва от тук: Lynx for Windows
Причината да използвам конзолния браузер Lynx е, че много сайтове използват gzip компресия на страниците, за да се зареждат по-бързо. Така не ми се налага да правя еквилибристики от сорта на:

wget -O - somesite.com | gunzip -c

Share and Enjoy !

Shares