Foreach делает действие статической функцией по имени в laravel: x - PullRequest
0 голосов
/ 26 апреля 2019

Кто-нибудь, пожалуйста, помогите мне просветить в LARAVEL !!!

в контроллере LARAVEL я задаю статическую функцию следующим образом:

namespace App\Http\Controllers\MyAPI;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class MyAPIController extends Controller {

    const acceptMethod = ['GET','POST','PUT','DELETE']

    public function handler(Request $request) {
           $acceptMethod = self::acceptMethod;
           $ctrl = new PromotionController;
           $method = $request->method()

         // This is my question :((
          if ($method == 'GET')
              $ctrl::read($request);
          if ($method == 'GET')
              $ctrl::post($request);
          $ctrl::put($request);
          ... 

          //I want to be like this : 
           foreach($acceptMethod as $method) {
              // Not work 
               $ctrl::($method)($request);
           }


    }

    public static function read(Request $request) {
        return something;
    }

    public static function post(Request $request) {
        return ...;
    }

    public static function put(Request $request) {
        return ...;
    }

    public static function delete(Request $request) {
        return ...;
    }

}

И тогда я должен использовать controll как:

  if ($method == 'get')
      $ctrl::read($request);
  if ($method == 'post')
      $ctrl::post($request);
  $ctrl::put($request);

Но у меня есть массив:

и я хочу быть таким:

 $acceptMethod = ['GET','POST','PUT','DELETE'];   
 foreach($acceptMethod as $functionName) {
    // Not work 
    $ctrl::$functionName($request);
 }

Есть ли способ сделать это возможным?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Маршруты

Правильный способ сделать это - определить ресурс RESTful для вашего объекта, чтобы вы получили все маршруты RESTful.В ваших маршрутах / api.php

Route::resource('thing','MyAPIController');

Это будет магическим путем:

  • GET api / thing to index ()
  • GET api / thing / createсоздать ()
  • API-интерфейс POST / вещь для хранения ()
  • GET API / вещь / {идентификатор}, чтобы показать ($ id)
  • GET API / вещь / {id} / edit для редактирования ()
  • PATCH api / thing / {id} для обновления ()
  • DELETE api / thing / {id} для уничтожения ()

Если у вас есть несколько объектов в REST, вам просто нужно добавить контроллер для каждого.

Что не так $ ctrl :: {$ fn} ($ request)

Инъекция всегдав топ-10 OWASP каждый год, и это открывает потенциальную функцию инъекции .Вы можете уменьшить этот риск, убедившись, что вы занесете в белый список метод.Но я бы предпочел использовать Laravel так, как это было задумано.

0 голосов
/ 26 апреля 2019

Использовать {};

Пожалуйста, попробуйте это внутри цикла:

$fn = strtolower($functionName)
$ctrl::{$fn}($request);

Вы также можете вызвать атрибут ..

$ instance -> {'attribute_name '};

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...