From 93baeb11e8a782c9b0a2f57fc848d839e2be10c6 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 10 Sep 2017 02:35:12 +0200 Subject: [PATCH 1/8] fix for libs folder uppercase/lowercase issue https://github.com/panique/mini3/issues/7 --- application/{libs => Libs}/helper.php | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename application/{libs => Libs}/helper.php (100%) diff --git a/application/libs/helper.php b/application/Libs/helper.php similarity index 100% rename from application/libs/helper.php rename to application/Libs/helper.php From 75c0a61725bd6b6194b38c5f4276a19867f6aca6 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 10 Sep 2017 02:47:37 +0200 Subject: [PATCH 2/8] fix for libs folder uppercase issue (part 1 of 2, folder and content removed) --- application/Libs/helper.php | 57 ------------------------------------- 1 file changed, 57 deletions(-) delete mode 100644 application/Libs/helper.php diff --git a/application/Libs/helper.php b/application/Libs/helper.php deleted file mode 100644 index 3897934..0000000 --- a/application/Libs/helper.php +++ /dev/null @@ -1,57 +0,0 @@ - $value) { - - // check if named parameters (':param') or anonymous parameters ('?') are used - if (is_string($key)) { - $keys[] = '/' . $key . '/'; - } else { - $keys[] = '/[?]/'; - } - - // bring parameter into human-readable format - if (is_string($value)) { - $values[$key] = "'" . $value . "'"; - } elseif (is_array($value)) { - $values[$key] = implode(',', $value); - } elseif (is_null($value)) { - $values[$key] = 'NULL'; - } - } - - /* - echo "
[DEBUG] Keys:
";
-        print_r($keys);
-
-        echo "\n[DEBUG] Values: ";
-        print_r($values);
-        echo "
"; - */ - - $raw_sql = preg_replace($keys, $values, $raw_sql, 1, $count); - - return $raw_sql; - } - -} From 74e9ea455979b32872d87ce05c9f0fc9d8ce767f Mon Sep 17 00:00:00 2001 From: panique Date: Tue, 13 Sep 2022 01:30:18 +0200 Subject: [PATCH 3/8] 2022 update: PHP8.1, Ubuntu 22.04, nginx, easier setup --- .htaccess | 4 - README.md | 30 ++++++- _vagrant/Vagrantfile => Vagrantfile | 10 ++- _install/mini3.png | Bin 59857 -> 0 bytes _install/{ => mysql}/01-create-database.sql | 0 _install/{ => mysql}/02-create-table-song.sql | 0 .../03-insert-demo-data-into-table-song.sql | 0 _install/nginx/default | 69 ++++++++++++++++ _vagrant/bootstrap.sh | 76 ------------------ application/Core/Application.php | 4 +- bootstrap.sh | 57 +++++++++++++ composer.json | 13 --- 12 files changed, 161 insertions(+), 102 deletions(-) delete mode 100644 .htaccess rename _vagrant/Vagrantfile => Vagrantfile (79%) mode change 100644 => 100755 delete mode 100644 _install/mini3.png rename _install/{ => mysql}/01-create-database.sql (100%) rename _install/{ => mysql}/02-create-table-song.sql (100%) rename _install/{ => mysql}/03-insert-demo-data-into-table-song.sql (100%) create mode 100644 _install/nginx/default delete mode 100644 _vagrant/bootstrap.sh create mode 100644 bootstrap.sh diff --git a/.htaccess b/.htaccess deleted file mode 100644 index 0d0f372..0000000 --- a/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ -# This file is - if you set up MINI correctly - not needed. -# But, for fallback reasons (if you don't route your vhost to /public), it will stay here. -RewriteEngine on -RewriteRule ^(.*) public/$1 [L] diff --git a/README.md b/README.md index 5656cc4..9392566 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,12 @@ # MINI3 MINI3 is an extremely simple and easy to understand skeleton PHP application, reduced to the max. -MINI3 is NOT a professional framework and it does not come with all the stuff real frameworks have. +MINI3 is NOT a professional framework and does not come with all the stuff real frameworks have. If you just want to show some pages, do a few database calls and a little-bit of AJAX here and there, without reading in massive documentations of highly complex professional frameworks, then MINI3 might be very useful for you. MINI3 is easy to install, runs nearly everywhere and doesn't make things more complicated than necessary. + [MINI](https://github.com/panique/mini) (original version) and [MINI2](https://github.com/panique/mini2) (used Slim router) were built by me (panique), MINI3 is an excellent and improved version of the original MINI, made by [JaoNoctus](https://github.com/JaoNoctus). Big thanks, man! :) @@ -24,12 +25,33 @@ of the original MINI, made by [JaoNoctus](https://github.com/JaoNoctus). Big tha - uses only native PHP code, so people don't have to learn a framework - uses PSR-4 autoloader -## Requirements +## Requirements (but it's auto-installed) -- PHP 5.6 or PHP 7.0 +- PHP 8 - MySQL -- mod_rewrite activated (see below for tutorials) - basic knowledge of Composer for sure +- for auto-installation: VirtualBox, Vagrant + +## Installation (in Vagrant, 100% automatic) + +To keep things super-simple, we are using Vagrant here, a simple technology to run virtual machines for development. +It's outdated, but does the job, and is much easier to understand than Docker. Just install VirtualBox, Vagrant, then +copy this repo's code to a folder, go to that folder and type: + +```bash +vagrant up +``` + +This will create a virtual machine with the configs given in `Vagrantfile`: It will create an Ubuntu 2022.04 Jammy64 +VM with 1024MB RAM, sync the current folder to `/var/www/html` inside the VM, make the VM available on the IP +`192.168.56.77` and start the bash script `bootstrap.sh`, which is just a set of commands that will install all +necessary software. + +If the auto-installer is finished, go to http://192.168.56.77 in your browser and click around a bit ;) + +# OLD INSTALLATION TUTORIALS FROM 2016 + +Below you'll find installation tutorial for the old version of MINI3 from 2016. ## Installation (in Vagrant, 100% automatic) diff --git a/_vagrant/Vagrantfile b/Vagrantfile old mode 100644 new mode 100755 similarity index 79% rename from _vagrant/Vagrantfile rename to Vagrantfile index 0737289..a0b96fb --- a/_vagrant/Vagrantfile +++ b/Vagrantfile @@ -6,11 +6,15 @@ VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| - # Every Vagrant virtual environment requires a box to build off of. - config.vm.box = "ubuntu/trusty64" + # Ubuntu 2022.04 + config.vm.box = "ubuntu/jammy64" # Create a private network, which allows host-only access to the machine using a specific IP. - config.vm.network "private_network", ip: "192.168.33.66" + config.vm.network "private_network", ip: "192.168.56.77" + + config.vm.provider "virtualbox" do |vb| + vb.memory = "1024" + end # Share an additional folder to the guest VM. The first argument is the path on the host to the actual folder. # The second argument is the path on the guest to mount the folder. diff --git a/_install/mini3.png b/_install/mini3.png deleted file mode 100644 index 78c6e085a309bb1d96603ab41c6d8ccb1555ba9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59857 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 - DocumentRoot "/var/www/html/${PROJECTFOLDER}/public" - - AllowOverride All - Require all granted - - -EOF -) -echo "${VHOST}" > /etc/apache2/sites-available/000-default.conf - -# enable mod_rewrite -sudo a2enmod rewrite - -# restart apache -service apache2 restart - -# remove default apache index.html -sudo rm "/var/www/html/index.html" - -# install git -sudo apt-get -y install git - -# git clone MINI -sudo git clone https://github.com/panique/mini3 "/var/www/html/${PROJECTFOLDER}" - -# install Composer -curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer - -# go to project folder, create the PSR4 autoloader with Composer -cd "/var/www/html/${PROJECTFOLDER}" -composer install - -# run SQL statements from MINI3 folder -sudo mysql -h "localhost" -u "root" "-p${PASSWORD}" < "/var/www/html/${PROJECTFOLDER}/_install/01-create-database.sql" -sudo mysql -h "localhost" -u "root" "-p${PASSWORD}" < "/var/www/html/${PROJECTFOLDER}/_install/02-create-table-song.sql" -sudo mysql -h "localhost" -u "root" "-p${PASSWORD}" < "/var/www/html/${PROJECTFOLDER}/_install/03-insert-demo-data-into-table-song.sql" - -# put the password into the application's config. This is quite hardcore, but why not :) -sudo sed -i "s/12345678/${PASSWORD}/" "/var/www/html/${PROJECTFOLDER}/application/config/config.php" - -# final feedback -echo "Voila!" diff --git a/application/Core/Application.php b/application/Core/Application.php index f6976ed..e6cb686 100644 --- a/application/Core/Application.php +++ b/application/Core/Application.php @@ -37,7 +37,7 @@ public function __construct() $this->url_controller = new $controller(); // check for method: does such a method exist in the controller ? - if (method_exists($this->url_controller, $this->url_action)) { + if (method_exists($this->url_controller, (string) $this->url_action)) { if (!empty($this->url_params)) { // Call the method and pass arguments to it @@ -48,7 +48,7 @@ public function __construct() } } else { - if (strlen($this->url_action) == 0) { + if (empty($this->url_action)) { // no action defined: call the default index() method of a selected controller $this->url_controller->index(); } else { diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100644 index 0000000..a9d7c31 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +# Use single quotes instead of double quotes to make it work with special-character passwords. +# If you change it here, also change it in the config.php file! +PASSWORD='12345678' + +# update / upgrade +sudo apt-get update +sudo apt-get -y upgrade + +# php +sudo apt install -y php8.1-fpm +# php modules +sudo apt install -y php-xml +sudo apt install -y php-mbstring +sudo apt install -y php-zip + +# nginx, copy nginx config into Vagrant box, syntax check, restart nginx +sudo apt install -y nginx +cp /var/www/html/_install/nginx/default /etc/nginx/sites-available/default +sudo nginx -t +sudo systemctl restart nginx + +# mysql (pw 12345678), user "root" +sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password $PASSWORD" +sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $PASSWORD" +sudo apt-get install -y mysql-server +sudo apt-get install -y php8.1-mysql + +# run SQL statements +sudo mysql -h "localhost" -u "root" "-p${PASSWORD}" < "/var/www/html/_install/mysql/01-create-database.sql" +sudo mysql -h "localhost" -u "root" "-p${PASSWORD}" < "/var/www/html/_install/mysql/02-create-table-song.sql" +sudo mysql -h "localhost" -u "root" "-p${PASSWORD}" < "/var/www/html/_install/mysql/03-insert-demo-data-into-table-song.sql" + +# phpmyadmin (and add symlink to it's reachable via /phpmyadmin) +sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/dbconfig-install boolean true" +sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/app-password-confirm password $PASSWORD" +sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/mysql/admin-pass password $PASSWORD" +sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/mysql/app-pass password $PASSWORD" +sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect nginx" +sudo apt-get install -y phpmyadmin +sudo ln -s /usr/share/phpmyadmin /var/www/html/public/phpmyadmin + +# install Composer +curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer + +# install Git +sudo apt-get install -y git + +# initial composer install, necessary to make the whole application work +cd /var/www/html && composer update + +# delete demo file from nginx +cd /var/www/html && rm index.nginx-debian.html + +# clickable link +echo "Hello, Hello! Click to start: http://192.168.56.77" \ No newline at end of file diff --git a/composer.json b/composer.json index 084542f..3f55986 100644 --- a/composer.json +++ b/composer.json @@ -1,18 +1,5 @@ { "name": "panique/mini3", - "description": "MINI3 - an extremely simple naked PHP application", - "type": "project", - "license": "MIT", - "authors": [ - { - "name": "Panique", - "email": "panique@firemail.de" - }, - { - "name": "John Dias", - "email": "joaodias@noctus.org" - } - ], "minimum-stability": "dev", "require": {}, "autoload": From c707986b33a21b21060e518e7119b42caefe9560 Mon Sep 17 00:00:00 2001 From: panique Date: Tue, 13 Sep 2022 01:36:03 +0200 Subject: [PATCH 4/8] 2022 update: PHP8.1, Ubuntu 22.04, nginx, easier setup --- _install/mini3.png | 0 _install/nginx/default | 61 ++++++------------------------------------ 2 files changed, 8 insertions(+), 53 deletions(-) create mode 100644 _install/mini3.png diff --git a/_install/mini3.png b/_install/mini3.png new file mode 100644 index 0000000..e69de29 diff --git a/_install/nginx/default b/_install/nginx/default index bc8b24e..69389e7 100644 --- a/_install/nginx/default +++ b/_install/nginx/default @@ -8,62 +8,17 @@ server { server_name _; -# location / { -# try_files $uri /index.php$is_args$args; -# } - location / { index index.php; try_files /$uri /$uri/ /index.php?url=$uri; } + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/run/php/php8.1-fpm.sock; + } - # pass PHP scripts to FastCGI server - # - #location ~ \.php$ { - # include snippets/fastcgi-php.conf; - # - # # With php-fpm (or other unix sockets): - # fastcgi_pass unix:/run/php/php7.4-fpm.sock; - # # With php-cgi (or other tcp sockets): - # fastcgi_pass 127.0.0.1:9000; - #} - - location ~ \.php$ { - include snippets/fastcgi-php.conf; - fastcgi_pass unix:/run/php/php8.1-fpm.sock; - #fastcgi_index index.php; - #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - #include fastcgi_params; - } - location ~ /\.ht { - deny all; - } - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} -} - - -# Virtual Host configuration for example.com -# -# You can move that to a different file under sites-available/ and symlink that -# to sites-enabled/ to enable it. -# -#server { -# listen 80; -# listen [::]:80; -# -# server_name example.com; -# -# root /var/www/example.com; -# index index.html; -# -# location / { -# try_files $uri $uri/ =404; -# } -#} + location ~ /\.ht { + deny all; + } +} \ No newline at end of file From 081d6b0c70dc318abdfd58d8d9c69fd8a15f4c30 Mon Sep 17 00:00:00 2001 From: panique Date: Tue, 13 Sep 2022 01:40:05 +0200 Subject: [PATCH 5/8] 2022 update: PHP8.1, Ubuntu 22.04, nginx, easier setup --- application/view/_templates/footer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/view/_templates/footer.php b/application/view/_templates/footer.php index 34d8820..a417d60 100644 --- a/application/view/_templates/footer.php +++ b/application/view/_templates/footer.php @@ -6,7 +6,7 @@ - +