ตัวเลือกที่ดีสำหรับการเริ่มต้นโครงการ 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+
ไดเรกทอรีแอพประกอบด้วยรหัสหลักของแอปพลิเคชันของคุณ เราจะสำรวจไดเรกทอรีนี้ในรายละเอียดเพิ่มเติมเร็ว ๆ นี้ อย่างไรก็ตามคลาสเกือบทั้งหมดในแอปพลิเคชันของคุณจะอยู่ในไดเรกทอรีนี้
ไดเรกทอรี config ตามชื่อมีความหมายมีไฟล์การกำหนดค่าแอปพลิเคชันทั้งหมดของคุณ รวมไฟล์กำหนดค่าเส้นทาง
ผู้ช่วยทำหน้าที่ในนั้น
ไดเรกทอรีหลักของเฟรมเวิร์กรวมถึงคลาส 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 มีดลาเวลคลิกที่นี่ https://github.com/eftec/bladeone/wiki/bladeone-manual View The BladeOne Manual
echo view('greeting', ['name' => 'James']);
พารามิเตอร์แรกคือชื่อเทมเพลตเช่น 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 ซึ่งรองรับหัว, รับ, โพสต์, ใส่, แพทช์, ลบ, ลบ ['POST,GET'] หมายความว่าทั้งโพสต์และรับได้รับการสนับสนุน ['*'] ระบุว่าวิธีการ HTTP ทั้งหมดได้รับการสนับสนุน
บรรทัดที่สองแสดงถึงพา ธ เช่น /users/{uid}/posts/[{pid}][/] : ในการจัดฟันโค้งเป็นพารามิเตอร์ตัวแปรพารามิเตอร์เสริมในวงเล็บเช่นพารามิเตอร์ที่ไม่ได้ผ่านใน URL, [/]
บรรทัดที่สามหมายถึงการเรียกกลับ PHP, รองรับวิธีการเรียน, วิธีการคงที่ของคลาส, ฟังก์ชั่นที่ไม่ระบุชื่อ, ฟังก์ชั่น ฯลฯ
บรรทัดที่สี่เป็นตัวเลือกและระบุชื่อของเส้นทางที่มีชื่อ
คีย์มิดเดิลแวร์เป็นตัวเลือกการลงทะเบียนมิดเดิลแวร์
AMAMSEPHP Request Class เป็นวิธีที่มุ่งเน้นวัตถุในการโต้ตอบกับคำขอ 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 ไม่ได้จัดให้มีการตอบสนองด้วยเหตุผลด้านประสิทธิภาพ ใช้ส่วนหัว () funcion และ echo หรือกลับไปที่การตอบสนองในคอนโทรลเลอร์หรือมิดเดิลแวร์
แทนที่จะกำหนดตรรกะการจัดการคำขอทั้งหมดของคุณเป็นการปิดไฟล์เส้นทางของคุณคุณอาจต้องการจัดระเบียบพฤติกรรมนี้โดยใช้คลาส "คอนโทรลเลอร์" คอนโทรลเลอร์สามารถจัดกลุ่มการจัดการคำขอที่เกี่ยวข้องในชั้นเรียนเดียว ตัวอย่างเช่นคลาส UserController อาจจัดการคำขอที่เข้ามาทั้งหมดที่เกี่ยวข้องกับผู้ใช้รวมถึงการแสดงการสร้างการอัปเดตและการลบผู้ใช้ โดยค่าเริ่มต้นคอนโทรลเลอร์จะถูกเก็บไว้ในไดเรกทอรี app/Controllers
ใน app/Controllers DIR คุณสามารถเขียนคอนโทรลเลอร์บางส่วนได้เช่น:
<?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,
];
ดูการกำหนดเส้นทาง
Façadeให้อินเทอร์เฟซการโทรแบบคงที่สำหรับคลาส (แบบไดนามิก) ของไลบรารีคลาสแกนกลางของเฟรมเวิร์กให้คุณสามารถเรียกใช้วิธีการคลาสแบบไดนามิกแบบคงที่
ในแอพ คอนโทรลเลอร์ 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/facade
คอนเทนเนอร์เป็นเครื่องมือที่ทรงพลังสำหรับการจัดการการพึ่งพาคลาสและทำการฉีดพึ่งพา
ตัวอย่างเช่น:
<?php
namespace AppControllers;
use AmazePHPRequest;
class Foo
{
public function bar(Request $request, $id)
{
echo $request->url();
}
}
?>
เมธอดบาร์ขึ้นอยู่กับคลาสคำขอคุณสามารถใส่คำขอ $ คำขอในพารามิเตอร์บาร์ FRAMEWORK จะโทรอัตโนมัติคลาสคำขอเพื่อให้คุณสามารถใช้วิธีการคลาสคำขอ: เช่น $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']);
การตอบสนอง $ เป็นอาร์เรย์ที่มีสถานะ _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 = [])
เซสชันจะปิดโดยค่าเริ่มต้นหากคุณต้องการเปิดโปรดเปลี่ยนเซสชัน _enable ในไฟล์. ENV เป็น TRUE
session(["name" => "value"]);
$value = session('name')
$value = request()->cookie('name');
cookie('name','value',86400); // 86400 seconds
ส่วนประกอบฐานข้อมูลใช้ PdoOne ซึ่งเป็น Wrapper Object Access Object สำหรับ PHP และ PDO คลิก https://github.com/eftec/pdoone เพื่อดูวิธีการใช้งาน
ด้านล่างเป็นตัวอย่างของวิธีการใช้งานอย่างง่าย
เลือก:
$results = db()->select("*")->from('users')->where("name like '%test%'")->toList();
print_r($results);
ใช้ RAW SQL:
$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)
AMAMEPHP สร้าง "โทเค็น" CSRF โดยอัตโนมัติสำหรับเซสชันผู้ใช้ที่ใช้งานแต่ละคนที่จัดการโดยแอปพลิเคชัน โทเค็นนี้ใช้เพื่อตรวจสอบว่าผู้ใช้ที่ได้รับการรับรองความถูกต้องเป็นบุคคลที่ทำการร้องขอแอปพลิเคชัน เนื่องจากโทเค็นนี้ถูกเก็บไว้ในเซสชันของผู้ใช้และเปลี่ยนแปลงทุกครั้งที่เซสชันได้รับการสร้างใหม่แอปพลิเคชันที่เป็นอันตรายจึงไม่สามารถเข้าถึงได้
โทเค็น CSRF ของเซสชันปัจจุบันสามารถเข้าถึงได้ผ่านฟังก์ชั่น csrf_token Helper:
$token = csrf_token();
เมื่อใดก็ตามที่คุณกำหนด "โพสต์", "ใส่", "แพตช์" หรือ "ลบ" แบบฟอร์ม HTML ในแอปพลิเคชันของคุณคุณควรรวมฟิลด์ CSRF _token ที่ซ่อนอยู่ในแบบฟอร์มเพื่อให้มิดเดิลแวร์ป้องกัน CSRF สามารถตรวจสอบความถูกต้องได้ เพื่อความสะดวกคุณสามารถใช้คำสั่ง @csrf Blade เพื่อสร้างฟิลด์อินพุตโทเค็นที่ซ่อนอยู่:
<form method="POST" action="/profile">
@csrf
<!-- Equivalent to... -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
นอกเหนือจากการตรวจสอบโทเค็น CSRF เป็นพารามิเตอร์โพสต์แล้ว libVerifyCsrfToken จะตรวจสอบส่วนหัวคำขอ X-CSRF-TOKEN ตัวอย่างเช่นคุณสามารถเก็บโทเค็นไว้ในแท็ก HTML meta :
<meta name="csrf-token" content="{{ csrf_token() }}">
จากนั้นคุณสามารถแนะนำห้องสมุดเช่น jQuery เพื่อเพิ่มโทเค็นโดยอัตโนมัติในส่วนหัวคำขอทั้งหมด สิ่งนี้ให้การป้องกัน CSRF ที่สะดวกและสะดวกสบายสำหรับแอปพลิเคชันที่ใช้ 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 เร็วกว่า Laravel ประมาณ 9x ในเกณฑ์มาตรฐาน hello world
Laravel: 2900 RPS
Amazephp: 23000 RPS
ทั้งการดีบักเปิดและ Laravel ใช้ไดรเวอร์เซสชันอาร์เรย์