Mini-FWK ist ein PHP-Framework für diesen Fokus auf die Leistung. Es hat die folgenden Funktionen:
OBS: Diese Dokumentation umfasst nicht alle Framework -Funktionen. Fühlen Sie sich frei, weitere Beispiele oder Abschnitte hinzuzufügen.
Führen Sie den folgenden Befehl aus, um das Beispielprojekt zu klonen und Abhängigkeiten zu installieren
$ git clone [email protected]:StartiOne/mini-fwk.git myproject
$ cd myproject
$ rm -Rf .git
$ cp .env.example .env Controller sind der Einstiegspunkt für HTTP -Anfragen. Spezielle Anmerkungen werden verwendet, um URLs und Middlewares für Controller -Methoden zu definieren. Store Controller in Ordner src/Controllers folgen dem Beispiel:
<?php
namespace App Controllers ;
use Mini Helpers Request ;
class ExampleController
{
/**
* @Get("/example")
* @Middleware("permission:SOME_PERMISSION")
*/
public function index ()
{
$ data = Request:: instance ()-> get ( ' data ' );
response ()-> json ([ ' data ' => $ data ]);
}
} Standardmäßig werden die Dateien im Zusammenhang mit URL -Routing in src/routes gespeichert. Da die Controller Routen mit Anmerkungen definieren können, müssen Sie sie nicht bearbeiten. Um Routen aus Ihren Controller -Anmerkungen zu generieren, führen Sie den folgenden Befehl in Ihrem Projektverzeichnis aus:
$ ./console route:scan Sie können JSON mit MiniHelpersRequest und MiniHelpersResponse lesen. Siehe folgende Beispiele:
<?php
namespace App Controllers ;
class RequestExampleController
{
/**
* @Get("/request-example")
*/
public function index ()
{
$ req = Mini Helpers Request:: instance ();
echo $ req -> get ( ' data.name ' ); // Get the key from the JSON input, $_REQUEST or $_FILES using *dots* to represent nested arrays
( new Mini Helpers Response )-> json ([ ' data ' =>[ ' token ' => ' ab ' ]], 200 ); // Output {data: {token: 'ab'}}
response ()-> json ([ ' data ' =>[ ' token ' => ' ab ' ]], 200 ); // Use a helper to do the same
}
} Middlewares sind nützlich, um eine Logik vor der Controller -Methode auszuführen. Speichern Sie Middlewares im Ordner src/Middlewares und aktualisieren Sie dann src/routers/middlewares.php nach dem Beispiel:
<?php
// src/routers/middlewares.php
return [
' permission ' => App Middlewares PermissionMiddleware::class
]; <?php
// src/Middlewares/PermissionMiddleware.php
namespace App Middlewares ;
class PermissionMiddleware
{
public function handler ( $ permission )
{
$ auth = app ()-> get ( ' App/Auth ' ); // Use the dependency container to store Auth class
$ token = $ auth -> getAccessToken ();
if ( $ token === null ) {
response ()-> json ([
' error ' => [
' code ' => ' 0001 ' ,
' detail ' => ' Unauthorized. ' ,
]
], 401 );
} else if ( $ auth -> hasPermission ( $ permission ) === false ) {
response ()-> json ([
' error ' => [
' code ' => ' 0001 ' ,
' detail ' => ' Forbidden. ' ,
]
], 403 );
}
}
} Die Datenvalidierung funktioniert mit der Klassen MiniValidationValidator und die derzeit unterstützten Regeln sind: Erforderlich, Zeichen, Zeichenfolge, Text, Ganzzahl, Float, Double, Decimal, Boolean, Datum, DateTime, Zeit, E -Mail, MaxLength, Minlength, Min, max.
Sie können Beispiele zu Unit -Tests überprüfen
<?php
namespace App Controllers ;
use Mini Helpers Request ;
use Mini Controllers BaseControllers ; // Implements validate and validateEntity
use App Models User ;
use App Models Retailer ;
class ValidationExampleController
{
/**
* @Get("/validation-example")
*/
public function index ()
{
// Complete example
$ validator = app ()-> get ( ' MiniValidationValidator ' );
$ validator -> setData (Request:: instance ()-> get ( ' data ' ))
$ validator -> validate ([
' name ' => ' string|required ' , // Rules are separeted by '|'
' addresses.*.street ' => ' string|required ' // Validate nested arrays inside 'addresses' key
]);
// Will throw ValidationException if error is found
echo ' Data successfuly validated ' ;
// Example using validate method. So you don't need a $validator instance
$ this -> validate ([
' name ' => ' string:6:255 ' , // Limit by length between 6 and 255 chars
]);
// Example using rules from model classe
$ this -> validateEntity ( new User );
// Example using multiple models
$ this -> validateEntities ([
' * ' => new Retailer ,
' owner ' => new User
]);
}
} Die Dienste werden in src/Services gespeichert, sie werden verwendet, um separate HTTP -Logik (Controller) von der Geschäftslogik zu enthalten und können MiniEntityDataMapper erweitern.
Modelle repräsentieren Geschäftsobjekte wie "Benutzer" oder "Einzelhändler" und enthalten Daten, die sich auf das Attributschema beziehen. Sie werden nach dem Beispiel in src/Models gespeichert:
<?php
namespace App Models ;
use Mini Entity Entity ;
use Mini Entity Behaviors QueryAware ;
class User extends Entity
{
use QueryAware; // Implement methods from MySQL ORM. Example: User::q()->listObject();
/**
* Table name used in MySQL
*
* @var string
*/
public $ table = ' users ' ;
/**
* Define fields 'updated_at' and 'created_at' to control timestamps
*
* @var bool
*/
public $ useTimeStamps = true ;
/**
* Define field 'deleted_at' to mark a row as deleted. Further calls to User::q() will automatically check for this field
*
* @type bool
*/
public $ useSoftDeletes = true ;
/**
* Field definition
*
* @type array
*/
public $ definition = [
' id ' => ' pk ' ,
' name ' => ' string ' ,
' password ' => ' string '
];
/**
* Fields that are filled and validated
*
* @var array
*/
public $ fillable = [
' name ' ,
' password '
];
/**
* Fields that are serialized with json_encode
*
* @var array
*/
public $ visible = [
' id ' ,
' name '
];
} Sie können komplexe MySQL -Abfragen mit MiniEntityQuery -Klasse erstellen. Folgen Sie den Beispielen.
<?php
use Mini Entity Query ;
use App Models User ;
// Complete example
$ query = ( new Query )
-> connection ( ' default ' )
-> from ( ' users ' )
-> alias ( ' u ' )
-> select ([ ' u.id ' , ' u.name ' , ' um.email ' ])
-> innerJoin ( ' user_emails um ' , ' um.user_id ' , ' = ' , ' u.id ' )
-> where ( ' id ' , ' = ' , 1 );
$ user = $ query -> getArray ();
// Generating an sql
$ sql = $ query -> makeSql ();
// Using entity query alias in a Model that uses the trait `MiniEntityBehaviorsQueryAware`
$ users = User:: q ()-> limit ( 0 , 1 )-> listObject (); // Can be listArray if you dont need an objectSie können Beispiele zu Unit -Tests überprüfen
Sie können komplexe MongoDB -Abfragen mit MiniEntityMongoQuery -Klasse erstellen. Folgen Sie den Beispielen.
<?php
use Mini Entity Mongo Query ;
use App Models User ;
// Complete example
$ chatMessages = ( new Query ( ' mongo ' , ' chat_messages ' ))
-> filter ( ' chat_id ' , 1 )
-> projection ([ ' description ' => 1 ])
-> sort ([ ' timestamp ' => 1 ])
-> skip ( 5 )
-> limit ( 10 )
-> listArray ();
// Using entity query alias in a Model that uses the trait `MiniEntityMongoBehaviorsMongoQueryAware`
$ chatMessages = ChatMessage:: q ()-> filter ( ' chat_id ' , 1 )-> listArray ();Datenmigrationen und Saatgut sind unerlässlich, um MySQL -Schemata und Standarddaten zwischen Entwicklungs- und Produktionsumgebung zu synchronisieren. Es gibt zwei Möglichkeiten, eine Migration zu erstellen: manuell und automatisch. Am häufigsten ist es, eine Migration zu generieren, die automatisch auf Unterschiede in Ihrer Entitätsdefinition und auf das MySQL -Informationsschema prüft. Verwenden Sie das folgende Beispiel:
./console make:migration --diff # Create a migration for all tables
./console make:migration --diff --force # Force "alter tables" on "not null" columns
./console make:migration --diff --filter ' (permissoes|perfil_permissoes) ' # Check only tables matching the pattern
./console migrate # Run this after checking if the generated migration is okIn anderen Momenten wird eine manuelle Schaffung einer Migration benötigt. Führen Sie den folgenden Befehl aus und überprüfen Sie die erstellte Migration.
$ ./console make:migration
Migration file created at ~ /PROJECT_FOLDER/migrations/Migration20170531174950.php <?php
use Mini Entity Migration AbstractMigration ;
class Migration20170531174950 extends AbstractMigration
{
public $ connection = ' default ' ;
public function up ()
{
// this method is auto-generated, please modify it to your needs
$ this -> addSql ( ' UPDATE users SET email = NULL WHERE email = ''' );
}
public function down ()
{
// this method is auto-generated, please modify it to your needs
}
}Wenn Sie Samen verwenden, achten Sie darauf, anfängliche Samen nur für Dinge zu verwenden, die sich nicht ändern oder in der Produktion hinzugefügt werden.
Erstellen Sie Dateien in 'Seeds/initial/your_table_name' oder 'Seeds/test/your_table_name' folgen diesem Beispiel:
<?php
return [
' connection ' => ' default ' ,
' rows ' => [
[
' id ' => ' 1 ' , // Primary keys is required
' name ' => ' AdmFirewall ' ,
],
[
' id ' => ' 2 ' ,
' name ' => ' AdmVoice ' ,
]
]
];Dann können Sie Samen mit entweder "-initial" oder "-Test" -Flags ausführen. In diesem Befehl werden alle Zeilen aus Ihren ausgesätten Tabellen entfernt, die nicht in der Datei enthalten sind.
$ ./console db:seed --initialDie im Root -Verzeichnis Ihres Projekts ausführbare Konsole -ausführbare Datei kann mehrere rahmenbedingte Befehle ausführen. Es kann jedoch auch benutzergenerierte Befehle ausführen.
$ ./console make:command --name script:license:refresh --description " Update license file "
Command file created at ~ /PROJECT_FOLDER/src/Commands/ScriptLicenseRefresh.php <?php
namespace App Commands ;
use Mini Console Command AbstractCommand ;
use Commando Command as Commando ;
class ScriptLicenseRefresh extends AbstractCommand
{
/**
* @return string
*/
public function getName ()
{
return ' script:license:refresh ' ;
}
/**
* @return string
*/
public function getDescription ()
{
return ' Update license file ' ;
}
/**
* @param Commando $commando
*/
public function setUp ( Commando $ commando )
{
/**
* Example:
*
* $commando->option('name')
* ->describedAs('Command name, example: "script:invoice:process"')
* ->defaultsTo('');
*/
}
/**
* @param Commando $commando
*/
public function run ( Commando $ commando )
{
/**
* Example:
*
* echo $commando['name'];
*/
}
}Dann können Sie Ihren Befehl ausführen
. /console script:license:refreshEinige Aufgaben wie das Senden von E-Mails und das Importieren von Daten müssen im Hintergrund ausgeführt werden. Arbeiter sind Prozesse, die auf Befehl in die Warteschlangen warten. Installieren Sie zuerst Beanstalkd in Ihrem Computer.
$ apt-get install beanstalkd # Ubuntu/Debian
$ yum install beanstalkd # Fedora/CentosSchritt 1: Setup Beanstalkd in Ihrer .env -Datei einrichten
printf ' WORKER_DRIVER=BEANSTALKDnBEANSTALKD_HOST="127.0.0.1"nBEANSTALKD_PORT=11300 ' >> .env Schritt 2: Erstellen Sie eine Worker -Klassendatei in src/Workers
$ ./console make:worker --name ImportFile Schritt 3: Bearbeiten Sie die Datei src/Workers/ImportFileWorker und führen Sie den Arbeiter aus
$ ./console worker --run ImportFile # In production use something like supervisord to keep the process running foreverSchritt 4: Jobs senden
<?php
namespace App Controllers ;
use Mini Helpers Request ;
use Mini Workers WorkerQueue ;
class ExampleController
{
/**
* @Get("/example")
* @Middleware("permission:SOME_PERMISSION")
*/
public function index ()
{
WorkerQueue:: addQueue (
' SendEmail ' ,
[
' someparam ' => ' someargument '
]
);
}
} Die Datei src/Application.php kann zum Einrichten von Klassen und zur Behandlung von Ausnahmen verwendet werden. Beispiel:
<?php
namespace Mini ;
use Throwable ;
/**
* Application
*
* Handle application specific behaviors using predefined hooks methods. You can extend it in your app
*
* @package Mini
*/
class Application
{
public function afterContainerSetUp ()
{
// Is exected before router initialize
}
public function afterConfigurationSetup ()
{
// Is exected before router initialize
}
public function onException ( $ exception )
{
if ( $ exception instanceof Mini Validation ValidationException) {
response ()-> json ([
' error ' => [
' detail ' => $ exception -> errors
]
], 400 );
} else {
response ()-> json ([
' error ' => [
' detail ' => $ exception -> getMessage () . ' ' . $ exception -> getTraceAsString ()
]
], 500 );
}
}
}Es gibt einige globale Funktionen, die mit dem Framework verbunden sind. Beispiele:
// Get an item from an array using "dot" notation.
array_get ( $ _POST , ' user.email ' );
// Get variables from .env file
env ( ' DATABASE_NAME ' );
// Filter array keys
array_only ([ ' name ' => ' John ' , ' password ' => ' 123 ' ], [ ' name ' ]);
// Exclude array keys
array_except ([ ' name ' => ' John ' , ' password ' => ' 123 ' ], [ ' password ' ]);Sie können weitere Beispiele auf Quellcode überprüfen