اختيار جيد لبدء مشروع PHP ، يمكن استخدامه لتطوير الويب و API. يستغرق الأمر دقيقة واحدة فقط لبدء مشروع. إنه يتمتع بأداء عالي للغاية وتجربة تطوير سهلة الاستخدام للغاية. لا توجد مفاهيم معقدة ، لذلك لديها أدنى منحنى تعليمي.
composer create-project amazephp/amazephp
أو استخدم git clone:
git clone https://github.com/w3yyb/AmazePHP.git
cd AmazePHP
composer install
cd public/
php -S localhost:9080 server.php
افتح http: // localhost: 9080 في متصفحك.
PHP 8.1+
يحتوي دليل التطبيق على الكود الأساسي لتطبيقك. سنستكشف هذا الدليل بمزيد من التفصيل قريبًا ؛ ومع ذلك ، ستكون جميع الفئات في طلبك تقريبًا في هذا الدليل.
يحتوي دليل التكوين ، كما يوحي الاسم ، على جميع ملفات تكوين التطبيق الخاصة بك. قم بتضمين ملف التكوين المسار.
يعمل المساعد فيه.
دليل الإطار الأساسي ، ويشمل بعض فئة LIB. ويمكنك وضع ملف الفصل الخاص بك فيه.
يحتوي الدليل العام على ملف index.php ، وهو نقطة الدخول لجميع الطلبات التي تدخل التطبيق الخاص بك وتكوين التحميل التلقائي. يضم هذا الدليل أيضًا أصولك مثل الصور و JavaScript و CSS.
يحتوي دليل ذاكرة التخزين المؤقت على ملفات ذاكرة التخزين المؤقت الخاصة بك ، وتشمل ملفات السجل.
يحتوي دليل القالب على ملفات قالب HTML.
config('app'); //will read config/app.php, app.php return an array.
config('app.url')// == config('app')['url'];
// Retrieve a default value if the configuration value does not exist...
$value = config('app.timezone', 'Asia/Seoul');
لتعيين قيم التكوين في وقت التشغيل ، تمرير صفيف إلى وظيفة التكوين:
config(['app.timezone' => 'America/Chicago']);
$value = cache('key');
cache(['key' => 'value'], 10);// Expires after 10 seconds
يستخدم محرك القالب BladeOne ، وهو محرك قالب مشابه blade Laravel ، انقر هنا https://github.com/eftec/bladeone/wiki/Bladeone- Manual عرض دليل Bladeone.
echo view('greeting', ['name' => 'James']);
المعلمة الأولى هي اسم القالب ، IE template/greeting.blade.php .
env('key');
env('key','default');
القيمة الثانية التي تم تمريرها إلى وظيفة ENV هي "القيمة الافتراضية". سيتم إرجاع هذه القيمة في حالة عدم وجود متغير بيئة للمفتاح المحدد.
logger('some msg');//error log
logger('some msg','warning'); //warning log | support:emergency ,alert ,critical ,error ,warning ,notice ,info ,debug
انظر config/route.php
[
['GET'],
'/',
[AppControllersIndex::class, 'index'],
'routename',
'middleware'=>[AppMiddlewarea2Middleware::class,AppMiddlewareb2Middleware::class],
],
السطر الأول هو طريقة طلب HTTP ، والتي تدعم Head ، Get ، Post ، Put ، Patch ، Delete. ['POST,GET'] يعني أن كلا المنشور والحصول مدعومان. ['*'] يشير إلى أن جميع أساليب HTTP مدعومة.
يمثل السطر الثاني المسار ، مثل /users/{uid}/posts/[{pid}][/] : في أقواس مجعد هي معلمات متغيرة ، معلمات اختيارية بين قوسين ، أي معلمات لم تمر في عنوان URL ، [/] لإزالة المرقم الخلفي.
يشير السطر الثالث إلى عوائد PHP ، ودعم أساليب الفصل ، والطرق الثابتة للفئات ، والوظائف المجهولة ، والوظائف ، إلخ.
السطر الرابع اختياري ويشير إلى اسم المسار المسماة.
مفتاح الوسيطة هو اختياري لتوجيه السجل الوسيطة.
توفر فئة Amazephp request طريقة موجهة نحو الكائن للتفاعل مع طلب HTTP الحالي الذي يتم معالجته بواسطة التطبيق الخاص بك بالإضافة إلى استرداد المدخلات والملفات تعريفات والملفات التي تم تقديمها مع الطلب.
$input = request()->all();
$name = request()->input('name');
$value = request()->cookie('name');
$value = request()->header('X-Header-Name');
$method = request()->method();
request()->host();
$url = request()->url();
$urlWithQueryString = request()->fullUrl();
$uri = request()->path();
if (request()->is('admin/*')) {
// ...
}
$input = request()->only(['username', 'password']);
$input = request()->except(['credit_card']);
$file = request()->file('upload');
if ($file && $file->isValid()) {
$file->move(PUBLIC_PATH.'/myfile.'.$file->getUploadExtension());
return json(['code' => 0, 'msg' => 'upload success']);
}
المزيد من الاستخدامات انظر AmazephP/SRC/request.php.
لا توفر AmazephP فئة Respose لأسباب الأداء. استخدم Header () funcion و echo أو العودة إلى الاستجابة في وحدات التحكم أو الوسيطة.
بدلاً من تحديد جميع المنطق معالجة الطلبات كإغلاق في ملفات مسارك ، قد ترغب في تنظيم هذا السلوك باستخدام فئات "وحدة التحكم". يمكن أن تجمع المنطق المتعلق بتعاملات مع المنطق للطلب في فئة واحدة. على سبيل المثال ، قد تتعامل فئة UserController مع جميع الطلبات الواردة المتعلقة بالمستخدمين ، بما في ذلك إظهار المستخدمين وإنشاء وتحديث وحذف المستخدمين. بشكل افتراضي ، يتم تخزين وحدات التحكم في دليل app/Controllers .
في app/Controllers ، يمكنك كتابة بعض وحدات التحكم ، على سبيل المثال:
<?php
namespace AppControllers;
class Index
{
public function index()
{
echo 'Hello AmazePHP!';
}
}
بمجرد كتابة فئة وحدة تحكم وطريقة ، يمكنك تحديد طريق إلى طريقة وحدة التحكم مثل:
[
['GET'],
'/',
[AppControllersIndex::class, 'index']
],
عندما يتطابق طلب وارد للمسار المحدد URI ، سيتم استدعاء طريقة الفهرس على فئة App Controllers Index وسيتم تمرير معلمات المسار إلى الطريقة.
يستخدم الوسيطة ، والمعروفة أيضًا باسم HTTP Middleware ، بشكل أساسي لتعديل أو تصفية طلبات HTTP أو استجاباتها. جميع هذه الوسيطة موجودة في دليل التطبيق/الوسيطة.
يتم تقسيم الوسيطة إلى قبل البرامج الوسيطة وبعد الوسيطة. يتم استخدام الوسيطة بشكل أساسي لتعديل طلبات HTTP. بعد استخدام الوسيطة بشكل أساسي لتعديل استجابات HTTP.
Request->Before middleware->Actual action->After middleware->Response
الفرق الرئيسي بين قبل البرامج الوسيطة وبعد البرامج الوسيطة هو المكان الذي يتم فيه تنفيذ الرمز. في دليل التطبيق/الوسيطة:
إنشاء مثل bmiddleware.php
<?php
namespace AppMiddleware;
use AmazePHPMiddlewareInterface;
class bMiddleware implements MiddlewareInterface {
public function process($object, Closure $next,...$params)
{
//Perform some logic here
return $next($object);
}
}
?>
إنشاء مثل amiddleware.php
<?php
namespace AppMiddleware;
use AmazePHPMiddlewareInterface;
class aMiddleware implements MiddlewareInterface {
public function process($object, Closure $next,...$params)
{
$response = $next($object);
//Perform some logic here
return $response;
}
}
?>
في config/middleware.php ، اكتب ما يلي:
return [
AppMiddlewareaMiddleware::class,
AppMiddlewarebMiddleware::class,
];
انظر التوجيه.
توفر الواجهة واجهة استدعاء ثابتة للفئات (الديناميكية) من مكتبة الفئة الأساسية الخاصة بـ Framework.
In App Controllers Index Controller:
<?php
namespace AppControllers;
use AmazePHPFacadeRequest;
class Index
{
public function index()
{
echo Request::url();//call Request.php url method statically. Same as calling Request->url().
}
}
يتم وضع جميع واجهات النظام في دليل AmazePhP/SRC/واجهة.
الحاوية هي أداة قوية لإدارة التبعيات الفئة وإجراء حقن التبعية.
على سبيل المثال:
<?php
namespace AppControllers;
use AmazePHPRequest;
class Foo
{
public function bar(Request $request, $id)
{
echo $request->url();
}
}
?>
تعتمد طريقة الشريط على فئة الطلب $request->url() يمكنك وضع طلب الطلب $ في المعلمات الشريط.
تشمل السيناريوهات التي تدعم استخدام حقن التبعية (على سبيل المثال لا الحصر):
$response= httpGet('http://httpbin.org/get');
$response= httpGet('http://httpbin.org/get',['headername'=>'headervalue']);
$response= httpHead('http://httpbin.org/get',['headername'=>'headervalue']);
$response= httpDelete('http://httpbin.org/delete',['headername'=>'headervalue']);
$response= httpPost('http://httpbin.org/post',['senddataname'=>'senddatavalue']);
$response= httpPut('http://httpbin.org/put',['senddataname'=>'senddatavalue']);
$response= httpPatch('http://httpbin.org/patch',['senddataname'=>'senddatavalue']);
استجابة $ هي صفيف يحتوي على بيانات status_code ، رأس ، وبيانات الجسم.
معلمات الوظيفة هي كما يلي:
httpGet($url,$header = [])
httpHead($url,$header = [])
httpDelete($url,$header = [])
httpPost($url, $data, $isJson = true,$method='POST',$header = [])
httpPut($url, $data, $isJson = true,$method='PUT',$header = [])
httpPatch($url, $data, $isJson = true,$method='PATCH',$header = [])
تم إغلاق الجلسة افتراضيًا ، إذا كنت ترغب في فتحها ، فيرجى تغيير Session_enable في ملف .env إلى True.
session(["name" => "value"]);
$value = session('name')
$value = request()->cookie('name');
cookie('name','value',86400); // 86400 seconds
يستخدم مكون قاعدة البيانات PdoOne ، وهو غلاف كائن الوصول إلى قاعدة البيانات لـ PHP و PDO. انقر فوق https://github.com/eftec/pdoone لمعرفة كيفية استخدامه.
فيما يلي مثال على كيفية استخدامه بطريقة بسيطة.
يختار:
$results = db()->select("*")->from('users')->where("name like '%test%'")->toList();
print_r($results);
استخدم SQL RAW:
$sql='select * from users where id=1';
$pdoStatement=db()->runRawQuery($sql,[],false); // [] are the parameters
print_r($pdoStatement->fetchAll());
إدراج:
db()->insert("users"
,['name','email','password']
,['kevin','[email protected]','123456']);
تحديث:
db()->update("users"
,['name'=>'Captain-Crunch','email'=>'[email protected]'] // set
,['id'=>6]); // where
يمسح:
db()->delete("users"
,['id'=>6]); // where
// Get the current URL without the query string...
echo url()->current();
// Get the current URL including the query string...
echo url()->full();
// Get the full URL for the previous request...
echo url()->previous();
echo url("/posts/{$post->id}"); // http://example.com/posts/1
[
['GET'],
'/hello/{id}/foo/{sid}',
[new AppFoo, 'bar'],
'nameroute1'//Named Route
],
echo route('nameroute1', ['id' => 1, 'sid' => 2]);
// http://example.com/hello/1/foo/2
إذا كنت ترغب في استخدامه ، فقم أولاً بتمكين الجلسة.
إن مزارع الطلب المتقاطع هو نوع من الاستغلال الخبيث حيث يتم تنفيذ الأوامر غير المصرح بها نيابة عن مستخدم مصادق عليه. لحسن الحظ ، تجعل AmazePhP من السهل حماية طلبك من هجمات التزوير عبر الموقع (CSRF).
تقوم AmazePhP تلقائيًا بإنشاء "رمز" CSRF لكل جلسة مستخدم نشطة تديرها التطبيق. يتم استخدام الرمز المميز هذا للتحقق من أن المستخدم المصادق هو الشخص الذي يقدم بالفعل طلبات التطبيق. نظرًا لأنه يتم تخزين هذا الرمز المميز في جلسة المستخدم ويتغير في كل مرة يتم فيها تجديد الجلسة ، فإن تطبيق ضار غير قادر على الوصول إليه.
يمكن الوصول إلى رمز CSRF الحالي للجلسة عبر وظيفة المساعد csrf_token :
$token = csrf_token();
في أي وقت تقوم فيه بتحديد نموذج "post" أو "put" أو "patch" أو "delete" html في التطبيق الخاص بك ، يجب عليك تضمين حقل CSRF _token المخفي في النموذج بحيث يمكن للوسيطة الوسيطة CSRF التحقق من صحة الطلب. للراحة ، يمكنك استخدام توجيه شفرة @csrf لإنشاء حقل الإدخال الرمزي المخفي:
<form method="POST" action="/profile">
@csrf
<!-- Equivalent to... -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
بالإضافة إلى التحقق من رمز CSRF كمعلمة ما بعد ، سوف يتحقق libVerifyCsrfToken أيضًا من رأس طلب X-CSRF-TOKEN . يمكنك ، على سبيل المثال ، تخزين الرمز المميز في علامة meta HTML:
<meta name="csrf-token" content="{{ csrf_token() }}">
بعد ذلك ، يمكنك توجيه مكتبة مثل jQuery لإضافة الرمز المميز تلقائيًا إلى جميع رؤوس الطلبات. يوفر هذا حماية بسيطة ومريحة لتطبيقاتك القائمة على AJAX باستخدام تقنية JavaScript القديمة:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
يقوم AmazephP بتخزين رمز CSRF الحالي في ملف تعريف ارتباط XSRF-TOKEN المشفر والذي يتم تضمينه مع كل استجابة تم إنشاؤها بواسطة الإطار. يمكنك استخدام قيمة ملف تعريف الارتباط لتعيين رأس طلب X-XSRF-TOKEN .
يتم إرسال ملف تعريف الارتباط هذا في المقام الأول كراحة مطور نظرًا لأن بعض أطر عمل JavaScript والمكتبات ، مثل Angular و Axios ، يضع قيمته تلقائيًا في رأس X-XSRF-TOKEN على طلبات الأصل من نفس.
./phpunit --bootstrap vendor/autoload.php tests
./phpunit --bootstrap vendor/autoload.php tests --display-warnings
./phpunit --bootstrap vendor/autoload.php tests --display-deprecations
AmazephP هو حوالي 9x أسرع من Laravel في hello world Benchmark.
Laravel: 2900 RPS.
Amazephp: 23000 rps.
كل من الأخطاء المفتوحة ، ويستخدم Laravel برنامج تشغيل جلسة الصفيف.