معلمات سلسلة الاستعلام CakePHP 3.0 مقابل المعلمات التي تم تمريرها

StackOverflow https://stackoverflow.com//questions/21034180

  •  21-12-2019
  •  | 
  •  

سؤال

في CakePHP 3.0 تمت إزالة المعلمات المسماة (الحمد لله) لصالح معلمات سلسلة الاستعلام القياسية المضمنة مع أطر التطبيقات الأخرى.

ما ما زلت أجد صعوبة في فهمه هو أنه في أطر عمل MVC الأخرى، على سبيل المثال ASP.NET، يمكنك تمرير المعلمات في ActionResult (نفس الوظيفة):

Edit( int id = null ) {

    // do stuff with id

}

وسيتم تمرير المعرف لهذه الطريقة كسلسلة استعلام مثل: /Edit?id=1 وستستخدم التوجيه لجعله جميلًا مثل: /Edit/1.

في CakePHP، يتم تمرير أي شيء داخل معلمات الوظيفة مثل:

function edit( $id = null ) {

    // do stuff with $id

}

يجب أن يتم ذلك كمعلمة تم تمريرها مثل: /Edit/1 والذي يتجاوز فكرة سلسلة الاستعلام وكذلك الحاجة إلى التوجيه لتحسين عنوان URL.

إذا قمت بتسمية المعلمات الموجودة في الرابط لهذا التعديل مثل:

$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id));

ثم لا بد لي من القيام بما يلي:

public function edit() {

    $id = $this->request->query('id');

    // do stuff with $id

}

للحصول على معرف المعلمة مرت.أعتقد أنه سيتم التقاطه في الوظيفة كما هو الحال في ASP.NET لـ CakePHP 3.0 ولكنه لا يفعل ذلك.

أفضّل إضافة بادئة للقيم التي تم تمريرها في رابط التعديل بدلاً من مجرد تمريرها حتى لا أقلق بشأن الترتيب بنفس القدر على الطرف الآخر وأعرف ما هي وما إلى ذلك.

هل لعب أي شخص بأي من هاتين الطريقتين لتمرير البيانات إلى أساليبهما في CakePHP ويمكنه إلقاء المزيد من الضوء على الطرق الصحيحة للقيام بالأشياء وكيف ستؤدي التغييرات في الإصدار 3.0 إلى تحسين الأمور في هذا المجال...

هل كانت مفيدة؟

المحلول

هناك أنواع قليلة من معلمات الطلب في CakePHP 3.0.دعونا نراجعها:

سلسلة الاستعلام:يتم الوصول إليها مع $this->request->query(), ، لا يتم تمريرها إلى وظائف وحدة التحكم كوسائط ومن أجل إنشاء رابط ما عليك القيام به Html->link('My link', ['my_query_param' => $value])

الحجج التي تم تمريرها:النوع الخاص من الوسيطة هو الذي تستقبله وظيفة وحدة التحكم كوسيطة.يتم الوصول إليها إما كوسيطة أو عن طريق التفتيش $this->request->params['pass'].يمكنك إنشاء روابط باستخدام الوسائط التي تم تمريرها اعتمادًا على المسار، ولكن بالنسبة للمسار الافتراضي، يمكنك فقط إضافة معلمات موضعية إلى الرابط مثل Html->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])

طلب المعلمات:الوسائط التي تم تمريرها هي نوع فرعي من هذا النوع.معلمة الطلب هي القيمة التي يمكن أن توجد في الطلب من المعلومات التي يمكن استخلاصها من المسار.يمكن تحويل المعلمات إلى أنواع أخرى من المعلمات خلال فترة حياتهم.

خذ بعين الاعتبار هذا الطريق:

Router::connect('/articles/:year/:month/:day', [
  'controller' => 'articles', 'action' => 'archive'
]);

لقد أنشأنا بشكل فعال 3 معلمات طلب بهذا المسار: year, month و day ويمكن الوصول إليها مع $this->request->year $this->request->month و $this->request->day.من أجل بناء رابط لهذا نقوم بما يلي:

$this->Html->link(
  'My Link',
  ['action' => 'archive', 'year' => $y, 'month' => $m, 'day' => $d]
);

لاحظ أنه عندما يحدد المسار تلك المعلمات، لا يتم تحويلها كمعلمات سلسلة استعلام.الآن، إذا أردنا تحويل تلك الوسائط إلى وسيطات تم تمريرها، فإننا نربط هذا المسار بدلاً من ذلك:

Router::connect('/articles/:year/:month/:day',
  ['controller' => 'articles', 'action' => 'archive'],
  ['pass' => ['year', 'month', 'day']]
);

ستبدو وظيفة التحكم لدينا الآن كما يلي:

function archive($year, $month, $day) {
  ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top