في 25 نيسان (أبريل) 2019 ، شهدت النسخة الجديدة alpha
الرئيسية من الأعمال المصغرة " سليم" المصغرة ، النور ، وفي 18 أيار (مايو) ، أصبحت نسخة beta
. أقترح عليك أن تتعرف على الإصدار الجديد.
تحت القطع:
- حول ابتكارات الإطار
- كتابة تطبيق بسيط على Slim-4
- عن Slim و PhpStorm الصداقة
الجديد في Slim 4
الابتكارات الرئيسية مقارنة بالإصدار 3:
- الحد الأدنى من إصدار PHP هو 7.1 ؛
- دعم PSR-15 (البرامج الوسيطة) ؛
- إزالة تنفيذ رسائل المتشعب. تثبيت أي مكتبة متوافقة PSR-7 واستخدامها ؛
- إزالة التبعية البثرة . قم بتثبيت حاوية PSR-11 المتوافقة المفضلة لديك واستخدمها ؛
- القدرة على استخدام جهاز التوجيه الخاص بك (سابقًا ، لم يكن من الممكن التخلي عن FastRoute ) ؛
- تغيير تنفيذ معالجة الأخطاء ؛
- تغيير تنفيذ مخرجات الاستجابة ؛
- تمت إضافة مصنع لإنشاء مثيل للتطبيق ؛
- الإعدادات التي تمت إزالتها
- لم يعد Slim يعيّن
default_mimetype
إلى سلسلة فارغة ، لذلك تحتاج إلى تثبيته بنفسك في php.ini
أو في تطبيقك باستخدام ini_set('default_mimetype', '')
؛ - يقبل معالج طلب التطبيق الآن كائن الطلب فقط (في الإصدار القديم ، وافق على كائنات الطلب والاستجابة).
كيفية إنشاء تطبيق الآن؟
في الإصدار الثالث ، بدا إنشاء التطبيق مثل هذا:
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Slim\App; require 'vendor/autoload.php'; $settings = [ 'addContentLengthHeader' => false, ]; $app = new App(['settings' => $settings]); $app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response, array $args) { $name = $args['name']; $response->getBody()->write("Hello, $name"); return $response; }); $app->run();
الآن يقبل مُنشئ التطبيق المعلمات التالية:
الآن يمكنك أيضًا استخدام طريقة create
الثابتة لتطبيق factory \Slim\Factory\AppFactory
.
تقبل هذه الطريقة نفس المعلمات كمدخلات ، وكلها فقط اختيارية.
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response) { $name = $request->getAttribute('name'); $response->getBody()->write("Hello, $name"); return $response; }); $app->run();
أعطني 404 الأخطاء مرة أخرى!
إذا حاولنا فتح صفحة غير موجودة ، فسوف نحصل على رمز استجابة 500
، وليس 404
. لكي تتم معالجة الأخطاء بشكل صحيح ، تحتاج إلى الاتصال \Slim\Middleware\ErrorMiddleware
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Slim\Factory\AppFactory; use Slim\Middleware\ErrorMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new ErrorMiddleware( $app->getCallableResolver(), $app->getResponseFactory(), false, false, false ); $app->add($middleware); $app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response) { $name = $request->getAttribute('name'); $response->getBody()->write("Hello, $name"); return $response; }); $app->run();
الوسيطة
يجب أن تكون الوسيطة الآن تنفيذ PSR-15. كاستثناء ، يمكنك تمرير وظائف ، ولكن يجب أن يتطابق التوقيع مع الأسلوب process()
الخاص \Psr\Http\Server\MiddlewareInterface
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\RequestHandlerInterface; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->add(function (ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $response = $handler->handle($request); return $response->withHeader('Content-Type', 'application/json'); });
التوقيع ($request, $response, $next)
لم يعد مدعومًا
كيف تعيش من دون إعدادات؟
يمكنك العيش دون إعدادات. الأدوات المقدمة سوف تساعدنا في هذا.
httpVersion
و responseChunkSize
كان httpVersion
مسؤولاً عن إخراج إصدار البروتوكول في الاستجابة.
يحدد إعداد responseChunkSize
حجم كل قطعة تتم قراءتها من نص الاستجابة عند إرسالها إلى المستعرض.
الآن يمكن تعيين هذه الوظائف إلى باعث الإجابة.
اكتب باعث
<?php
نحن نتصل بالتطبيق
<?php use App\ResponseEmitter; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $serverRequestFactory = \Slim\Factory\ServerRequestCreatorFactory::create(); $request = $serverRequestFactory->createServerRequestFromGlobals();
outputBuffering
سمح هذا الإعداد تشغيل / إيقاف التخزين المؤقت الإخراج. تحديد القيم:
false
- تم إيقاف تشغيل التخزين المؤقت (يتم تجاهل جميع المكالمات إلى echo
، يتم تجاهل عبارات print
).'append'
- تتم إضافة جميع المكالمات إلى echo
، وتضاف بيانات print
بعد هيئة الاستجابة'prepend'
- جميع المكالمات إلى echo
، تتم إضافة بيانات print
قبل هيئة الاستجابة
يقترح مطورو \Slim\Middleware\OutputBufferingMiddleware
استبدال هذا الخيار \Slim\Middleware\OutputBufferingMiddleware
، في مُنشئ مُنشأة مصنع دفق متوافق مع PSR-17 ووضع يمكن أن يكون مساوياً prepend
أو prepend
<?php use Slim\Factory\AppFactory; use Slim\Factory\Psr17\SlimPsr17Factory; use Slim\Middleware\OutputBufferingMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new OutputBufferingMiddleware(SlimPsr17Factory::getStreamFactory(), OutputBufferingMiddleware::APPEND); $app->add($middleware);
determineRouteBeforeAppMiddleware
أتاح هذا الإعداد الحصول على المسار الحالي من كائن الطلب في البرنامج الوسيط
يتم توفير بديل \Slim\Middleware\RoutingMiddleware
<?php use Slim\Factory\AppFactory; use Slim\Middleware\RoutingMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new RoutingMiddleware($app->getRouteResolver()); $app->add($middleware);
displayErrorDetails
يسمح الإعداد لعرض تفاصيل الخطأ. عند تصحيح الأخطاء ، فإنه يجعل الحياة أسهل.
تذكر \Slim\Middleware\ErrorMiddleware
؟ هنا سوف يساعدنا!
<?php use Slim\Factory\AppFactory; use Slim\Middleware\ErrorMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new ErrorMiddleware( $app->getCallableResolver(), $app->getResponseFactory(), true,
addContentLengthHeader
يسمح هذا الإعداد بتمكين / تعطيل الإضافة التلقائية لرأس Content-Length
مع قيمة حجم البيانات في نص الاستجابة
يستبدل خيار الوسيطة \Slim\Middleware\ContentLengthMiddleware
<?php use Slim\Factory\AppFactory; use Slim\Middleware\ContentLengthMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new ContentLengthMiddleware(); $app->add($middleware);
routerCacheFile
يمكنك الآن تثبيت ملف ذاكرة التخزين المؤقت لجهاز التوجيه مباشرةً
<?php use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->getRouteCollector()->setCacheFile('/path/to/cache/router.php');
إنشاء تطبيق على Slim-4
لإلقاء نظرة فاحصة على الإطار ، سنقوم بكتابة طلب صغير.
سيكون للتطبيق الطرق التالية:
/hello/{name}
- صفحة الترحيب ؛/
- إعادة توجيه إلى الصفحة /hello/world
- ستُرجع المسارات الأخرى صفحة مخصصة بها 404 أخطاء.
سيكون المنطق في وحدات التحكم ، وسوف نقدم الصفحة من خلال محرك قالب غصين
كمكافأة ، قم بإضافة تطبيق وحدة التحكم استنادًا إلى مكون Symfony Console باستخدام أمر يعرض قائمة من المسارات
الخطوة 0. تثبيت التبعيات
سنحتاج:
لقد اخترت فائقة الحاوية / الحاوية كحاوية تبعية ، وخفيفة الوزن وموجزة ومتوافقة مع المعيار.
يوفر مطورو PSR-7 و PSR-Slim ضئيلة / ضئيلة psr7 في حزمة واحدة. سوف نستخدمها
من المفترض أن مدير حزمة Composer مثبت بالفعل.
نقوم بإنشاء مجلد للمشروع (سيتم استخدام /path/to/project
كمثال) وانتقل إليه.
أضف ملف composer.json
إلى المشروع بالمحتويات التالية:
{ "require": { "php": ">=7.1", "slim/slim": "4.0.0-beta", "slim/psr7": "~0.3", "ultra-lite/container": "^6.2", "symfony/console": "^4.2", "twig/twig": "^2.10" }, "autoload": { "psr-4": { "App\\": "app" } } }
وتنفيذ الأمر
composer install
الآن لدينا جميع الحزم اللازمة ويتم تكوين autoloader الطبقة.
إذا عملنا مع git ، فأضف ملف .gitignore
وأضف دليل vendor
هناك (ودليل IDE الخاص بك إذا لزم الأمر)
/.idea/* /vendor/*
أنا أستخدم IDE PhpStorm و فخور به . لتطوير مريح ، حان الوقت لتكوين صداقات مع الحاوية و IDE.
في جذر المشروع ، قم بإنشاء ملف .phpstorm.meta.php
واكتب التعليمة البرمجية التالية هناك:
<?php
\Psr\Container\ContainerInterface
هذا الرمز IDE بأنه بالنسبة لكائن يقوم بتطبيق \Psr\Container\ContainerInterface
، ستُرجع طريقة get()
كائن فئة أو تطبيق واجهة يتم تمرير اسمه في المعلمة.
الخطوة 1. إطار التطبيق
أضف الدلائل:
app
- رمز التطبيق. سنقوم بتوصيل مساحة الاسم الخاصة بنا إلى autoloader الخاصة بها ؛bin
- دليل الأداة المساعدة وحدة التحكم؛config
- هنا ستكون ملفات تكوين التطبيق ؛public
- دليل تم فتحه على الويب (نقطة إدخال التطبيق ، الأنماط ، js ، الصور ، إلخ) ؛- دليل
template
؛ var
هو الدليل لمختلف الملفات. السجلات ، ذاكرة التخزين المؤقت ، التخزين المحلي ، إلخ.
والملفات:
config/app.ini
- تهيئة التطبيق الرئيسية ؛config/app.local.ini
- التكوين للبيئة local
؛app/Support/CommandMap.php
- تعيين أوامر تطبيق وحدة التحكم للتحميل الكسول.app/Support/Config.php
- فئة التكوين (حتى يعرف IDE التكوينات التي لدينا).app/Support/NotFoundHandler.php
- 404 فئة معالج الأخطاء.app/Support/ServiceProviderInterface.php
- واجهة مزود الخدمة.app/Provider/AppProvider.php
- المزود الرئيسي للتطبيق.bootstrap.php
- تجميع الحاوية ؛bin/console
- نقطة الدخول لتطبيق وحدة التحكم ؛public/index.php
- نقطة إدخال تطبيق الويب.
التكوين / app.ini ; slim.debug=Off ; templates.dir=template ; templates.cache=var/cache/template
config / app.local.ini ; . ; slim.debug=On ; templates.cache=
أوه نعم ، لا يزال من الجيد استبعاد تكوينات البيئة من المستودع. بعد كل شيء ، قد يكون هناك مظاهر / كلمات المرور. يتم استبعاد ذاكرة التخزين المؤقت أيضًا.
.gitignore /.idea/* /config/* /vendor/* /var/cache/* !/config/app.ini !/var/cache/.gitkeep
التطبيق / الدعم / CommandMap.php التطبيق / الدعم / Config.php التطبيق / الدعم / NotFoundHandler.php الآن يمكنك تعليم PhpStorm لفهم المفاتيح التي تحتوي على المفاتيح ونوعها.
التطبيق / الدعم / ServiceProviderInterface.php التطبيق / مقدم / AppProvider.php لقد نقلنا التوجيه إلى الحاوية حتى نتمكن من العمل معها دون تهيئة الكائن \Slim\App
.
من المستحسن إعطاء هذا الملف حقوق التنفيذ
chmod +x ./bin/console
تحقق.
قم بتشغيل تطبيق وحدة التحكم:
./bin/console
استجابة لذلك ، يجب أن تظهر نافذة الترحيب الخاصة بمكون symfony/console
مع أمرين متاحين - help
list
.
Console Tool Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: help Displays help for a command list Lists commands
الآن ابدأ خادم الويب.
php -S localhost:8080 -t public public/index.php
وفتح أي رابط على المضيف المحلي: 8080.
يجب أن ترجع جميع الطلبات استجابة بالكود 404
فارغ.
يحدث هذا لأنه ليس لدينا طرق مدرجة.
يبقى لنا أن نربط التقديم ، وكتابة القوالب ، وأجهزة التحكم وتحديد الطرق.
الخطوة 2. تقديم
أضف قالب template/layout.twig
. هذا هو القالب الأساسي لجميع الصفحات.
القالب / layout.twig {# template/layout.twig #} <!DOCTYPE html> <html lang="en"> <head> <title>{% block title %}Slim demo{% endblock %}</title> </head> <body> {% block content %}{% endblock %} </body> </html>
إضافة template/hello.twig
صفحة الترحيب template/hello.twig
القالب / hello.twig {# template/hello.twig #} {% extends 'layout.twig' %} {% block title %}Slim demo::hello, {{ name }}{% endblock %} {% block content %} <h1>Welcome!</h1> <p>Hello, {{ name }}!</p> {% endblock %}
template/err404.twig
صفحة خطأ template/err404.twig
القالب / err404.twig {# template/err404.twig #} {% extends 'layout.twig' %} {% block title %}Slim demo::not found{% endblock %} {% block content %} <h1>Error!</h1> <p>Page not found =(</p> {% endblock %}
أضف app/Provider/RenderProvider.php
موفر التقديم app/Provider/RenderProvider.php
التطبيق / مقدم / RenderProvider.php قم بتشغيل الموفر في bootstrap
أضف تجسيدًا إلى معالج الأخطاء 404
التطبيق / الدعم / NotFoundHandler.php (مهرجان دبي السينمائي الدولي) التطبيق / المزود / AppProvider.php (مهرجان دبي السينمائي الدولي) 404 .
3.
2:
app/Controller/HomeController.php
—app/Controller/HelloController.php
—
( URL ), — ( html)
app/Controller/HomeController.php app/Controller/HelloController.php ,
app/Provider/WebProvider.php - ( )...
php -S localhost:8080 -t public public/index.php
… http://localhost:8080 , http://localhost:8080/hello/world
world'.
http://localhost:8080/hello/ivan ivan'.
, , http://localhost:8080/helo/world 404 .
4.
route:list
app/Command/RouteListCommand.php ,
app/Provider/CommandProvider.php ...
./bin/console route:list
… :
Routes ====== --------------- --------- ------- ------------------------------------- Route Methods Name Handler --------------- --------- ------- ------------------------------------- / GET index App\Controller\HomeController:index /hello/{name} GET hello App\Controller\HelloController:show --------------- --------- ------- -------------------------------------
, , !
, Slim — routes.php
( ), . — , , .