IT-Solutions for Special Requirements

Schlagwort: php Seite 1 von 2

Typo3 Fluid

Das Typo3 CMS verwendet Fluid als Template Engine. Diese Engine kann einfach auch in anderen PHP standalone Projekten verwendet werden. Warum sollte man das machen?

  • Ermöglicht einen Migrationspfad zum Typo3 CMS
  • Es ermöglicht das wiederverwenden von Fluid Templates in eigenen Projekten.
  • Es ermöglicht eine sukzesive Einarbeitung in die Typo3 Entwicklung, da andere Komponenten wie Extbase ausgelassen werden.

Wie integriert man Typo3/Fluid in ein standalone Projekt ohne dem Typo3 CMS? Wiefolgt:

composer require typo3fluid/fluid
composer install

Nach dem einfügen des Autoloaders wird dem standalone Projekt nur noch das TempalateView Objekt hinzugefügt:

use TYPO3Fluid\Fluid\View\TemplateView;

view = new TemplateView;

Es müssen noch verschiedene Pfade gesetzt werden. Außerdem sind bestimmte Directories notwenig:

site_package
└── Resources
    ├── Private
    │   ├── Language
    │   ├── Layouts
    │   │   └── Page
    │   ├── Partials
    │   │   └── Page
    │   └── Templates
    │       └── Page
    └── Public
        ├── Css
        ├── Images
        └── JavaScript

Eine Php Beispiel-Klasse in dem Typo3/Fluid in einer standalone Umgebung integriert wird, ist der https://github.com/q-u-o-s-a/fallout-grabber/blob/master/AbstractController.php des Fallout-Grabbers.

Weitere Informationen findet man unter: Typo3 Docs: FluidTemplates

Fast docker with Nginx, MariaDB and Php, Part IV

Nach dem erstellen der :

  • DB Container auf Basis von mariadb:10.1.48
  • PHP Container auf Basis von php:7.4-fpm
  • SCP Container auf Basis von atmoz/sftp

benötigen wir noch einen Nginx Container der zum Host Port 80 freigibt.

Die Konfiguration für den Nginx Container inkl. der Anhängigkeiten zu den Containern aus Part I-III sieht wiefolgt aus:

version: '3'
services:
  web:
    image: nginx:latest
    depends_on: 
      - sftp
      - php
      - db
    ports:
      - '80:80'
    volumes:
      - template-html:/var/www/html    
      - ./container/web/nginx.conf:/etc/nginx/conf.d/default.conf    

Ebenso wie der Php Container und der Sftp Container mountet der Nginx Container das template-html Volume.

Das Config-File ./container/web/nginx.conf wird in das Host-Dateisystem gemounet um einfach editiert zu werden.

Das gesamte Projekt befindet hier auf https://github.com/getit-berlin/fast-docker-php-template

Fast docker with Nginx, MariaDB and Php, Part II

Im letzen Beitrag zum Thema fast docker Part I habe ich einen einfachen DB Container erstellt. Hier folgt jetzt der dazugehörige Php Container:

  php:
    ports:
      - '22:22'  
    build: ./container/php/.
    volumes:
      - template-html:/var/www/html
      - ./container/php/php.ini:/usr/local/etc/php/php.ini
      - ./container/php/log.conf:/usr/local/etc/php-fpm.d/zz-log.conf      
    environment:
      PHP_OPCACHE_VALIDATE_TIMESTAMPS: 1  

volumes:
  template-html:

Die Datei php.ini wurde nach „außen“ in den Ordner container/php/ gelegt. Damit ist sie im auch nach dem Build und Deploy leicht veränderbar.

Das Volume template-html wird alle Anwendungsdaten beinhalten. Es entspricht dem /var/www/html directory.

Das Volume wird nicht nach außen gemountet.

Das Docker Container File Dockerfile beinhaltet weitere Pakete für den php container, wie z.B. zip, mysql, opcache, gd, composer, git, wget, apcu, imagemagick und basiert auf PHP 7.4-fpm:

FROM php:7.4-fpm
USER root
RUN apt-get update --fix-missing

RUN apt-get install --yes libicu-dev
RUN apt-get install --yes libjpeg62-turbo-dev
RUN apt-get install --yes libfreetype6-dev
RUN apt-get install --yes libpng-dev
	
RUN docker-php-ext-install -j$(nproc) mysqli pdo_mysql opcache
RUN docker-php-ext-configure gd --with-freetype --with-jpeg 
RUN docker-php-ext-install -j$(nproc) gd
RUN docker-php-ext-configure intl && \
    docker-php-ext-install -j$(nproc) intl
	
ENV PHP_OPCACHE_VALIDATE_TIMESTAMPS="0"
ADD opcache.ini "$PHP_INI_DIR/conf.d/opcache.ini"	

RUN cd /usr/src && \
    curl -sS http://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
	
RUN apt-get install --yes sudo
	
RUN apt-get install --yes unzip
RUN apt-get install --yes zip

RUN apt-get install --yes git
RUN apt-get install --yes bzip2	
RUN apt-get install --yes libbz2-dev	
RUN docker-php-ext-install bz2	

RUN apt-get install --yes wget

RUN apt-get install -y default-mysql-client

RUN apt-get install -y \
        libzip-dev \
        zip \
  && docker-php-ext-install zip

# APCU
RUN pecl channel-update pecl.php.net 
RUN pecl install apcu igbinary 
RUN docker-php-ext-enable apcu igbinary 

# IMAGICK
RUN apt-get update && apt-get install -y libmagickwand-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN printf "\n" | pecl install imagick
RUN docker-php-ext-enable imagick
RUN apt-get update && apt-get install -y imagemagick

RUN docker-php-source delete

#USER www-data
USER root

Die Datei opcache.ini wird für den opcache gebraucht.

Das gesamte Projekt befindet hier auf https://github.com/getit-berlin/fast-docker-php-template

Fast docker with Nginx, MariaDB and Php, Part I

Nach vielen Versuchen und Messungen der Perfomance unter Last habe ich folgendes docker-compose.yaml erstellt.

Hier ist erstmal die Definition des DB Containers:

  db:
    image: mariadb:10.1.48
    container_name: ${DB_HOST}
    restart: always
    ports:
      - '3306:3306'
    volumes:
        - template-db:/var/lib/mysql
    command: ['mysqld', '--character-set-server=${DB_CHARSET}', '--collation-server=${DB_COLLATION}']
    environment:
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
      
volumes:
  template-db:

Die verschiedenen Variablen werden via .env File festgelegt.

DB_HOST=deployment-db-2
DB_USER=run
DB_PASS=ldisfk24esf
DB_ROOT_PASS=ldiamQa943
DB_NAME=my_db
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci

Die Datenbank ist vom Host unter dem dem Port: 3306 und dem localhost erreichbar. Innerhalb der Docker-Container ist die Datenbank unter dem Host deployment-db-2 erreichbar.

Code smell … smells like … (Methoden)

Was stinkt und versteckt sich im Code? Hässliche Methoden im Code!

Das was ich am meisten hasse, sind hässliche Methoden

Albert einSTein

Nun, was sind hässliche Methoden und wie sollte man sie vermeiden? Wenn man sich einfach an PSR hält ist man schon auf der richtige Seite.

Hier noch zwei kleine Tips:

  • Max 3 Parameter pro Methode
  • 30 Linien pro Methode

PHP Update unter Laragon

Je nachdem wann man Laragon heruntergeladen und installiert hat, mag es sein, dass man einen alte PHP Version hat.

Das merkt man dann, wenn Composer einem bei:

composer update 

einen Fehler zurück gibt.

Wie macht man das nun bei Laragon? Wie aktualisiert man nun die PHP Version?

„Rechtsklick“ unter Laragon und dann in das Verzeichnis wechseln

Von https://windows.php.net/download/ die entsprechenden Version runterladen und diese in dem Verzeichnis entpacken.

Diese Version dann im Laragon Kontextmenü auswählen und Laragon Dienste restarten. 🥳 Fertig!

JoomLavel Connect, Create Components rapidly (RAD)

we have finished a first MVP of our JoomLavel component generator.

Simply checkout our public github project:

git clone https://github.com/JoomLavel/connect.git & compose

php JoomLavel make:component BobsFirstComponent --zip --verbose

… and enjoy component generation

In the working dirctory you can adjust your new component and import it as a zip file on a Joomla instance.

In general, RAD approaches to software development put less emphasis on planning and more emphasis on an adaptive process.

wikipedia.org/wiki/Rapid_application_development

Joomla, Laravel, JoomLavel und camelCase

Ein kleiner Überblick:

  • snake_case / lowercase => C / C++, (my favorite)
  • camelCase
  • PascalCase
  • kebab-case
FrameworkKlassenMethodenAttribute
LaravelPascalCasecamelCasecamelCase
WordPress CMSsnake_case
Joomla CMSPascalCasecamelCasecamelCase
Übersicht der Frameworks und der Schreibstile

In unserem JoomLavel Projekt halten wir uns an die Joomla und Laravel Stile. Es gibt bei Laravel natürlich folgendes zu bedenken:

By convention, the „snake case“, plural name of the class will be used as the table name unless another name is explicitly specified.

https://laravel.com/docs/7.x/eloquent#eloquent-model-conventions

Somit wird der Tabellenname in der Datenbank im snake_case im plural angegeben. Das entsprechde Model im Laravelcode aber im PascalCase

Im Eloquent Beispiel sieht das so aus:

DB Tabelle: my_flights, Model: MyFlight

Im Frontend in HTML sollten Attribute im kebap-case geschrieben werden. Wenn wir z.B. das data-attribute nutzen.

data-user-id="121"

make configuration.php beautiful

Joomla has a quite ugly configuration file. configuration.php is cluttered and sorted i a very strange way?

<?php
class JConfig {
	public $offline = '1';
	public $offline_message = 'Wartungsmodus';
	public $display_offline_message = '1';
	public $offline_image = '';
	public $sitename = 'joomlavel-joomla-dev';
	public $editor = 'tinymce';
	public $captcha = '0';
	public $list_limit = '20';
	public $access = '1';
	public $debug = '0';
	...
	...
	...
	public $feed_email = 'none';
	public $log_path = '/logs';
	public $tmp_path = '/tmp';
	public $lifetime = '15';
	public $session_handler = 'database';
	public $shared_session = '0';
}

I really like https://12factor.net/ and its twelve-factor app approach. configuration recommendation is to seperate config in a way that they are language- and OS-agnostic. But how to do this? Here is our approach:

    public function __construct(){
		if (file_exists(SELF::JoomLavelApiDirectory.'.env')) {
			$env = parse_ini_file (SELF::JoomLavelApiDirectory.'.env',false, INI_SCANNER_RAW);
			$this->sitename = $env['APP_NAME'];
			$this->debug = (int)filter_var($env['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN);;
			$this->live_site = $env['APP_URL'];
			$this->dbtype = $env['DB_CONNECTION'].'i';
			$this->host = $env['DB_HOST'];
			$this->db = $env['DB_DATABASE'];
			$this->user = $env['DB_USERNAME'];
			$this->password = $env['DB_PASSWORD'];
			
			$this->mailfrom = $env['MAIL_FROM_ADDRESS'];
			$this->fromname = $env['MAIL_FROM_NAME'];
			$this->smtpport = $env['MAIL_PORT'];
			$this->smtphost = $env['MAIL_HOST'];
			$this->smtpuser = $env['MAIL_USERNAME'];
			$this->smtppass = $env['MAIL_PASSWORD'];	
		}
		
    }

The configuration.php could also be seperated in blocks:

	#APP
	public $live_site = '';
	public $sitename = "joomla";
	
	#DB
	public $dbtype = 'mysqli';
	public $host = 'localhost';
	public $user = 'groot';
	public $password = '';
	public $db = 'joomlavel-dev';
	public $dbprefix = 'f862e_';
	
	#SESSION
	public $session_handler = 'database';
	public $shared_session = '0';
	public $lifetime = '15';

You can see the files in our Github::JoomLavel project.

We have a baby, we have called it: JoomLavel,

In the last 2 years we have worked in complicated Joomla CMS project. The project has grown and we hit joomla limitations.

How to leave a vendor-lockin and joomla limitations? A REST API might be the solution. The Separation_of_concerns principle describes a seperation of a computer program in distinct sections.

JoomLavel allows you to use a modern laravel API backend in combination with your own joomla application. You can easily add functionalities in the laravel api to enchance joomla functionalities without changing the joomla framework code or joomla components or plugins.

joomLavel name creation

Checkout our Github documentation page:

https://github.com/JoomLavel/documentation

More informations will be published the next days:

Seite 1 von 2

Präsentiert von WordPress & Theme erstellt von Anders Norén