Создание нового объекта php из динамического ввода (laravel / octobercms) - PullRequest
0 голосов
/ 07 февраля 2019

Наличие объектов в laravel:

use AAA;
use BBB;
use CCC;
...

Из ввода получим имя: "AAA ...";

$from_input = $some_input;

Могу ли я выполнить это:

$obj = new $from_input;
return $obj::where('status', 1)->get();

"новая" функция не может найти класс "AAA"

strval не помогает.Пожалуйста, совет.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете вызвать контейнер IoC, который создаст вам объект с любыми введенными зависимостями.

$obj = app()->make($from_input)

или просто

$obj = app($from_input)

0 голосов
/ 07 февраля 2019

Уведомление о безопасности Из-за небезопасности разрешения конечному пользователю создавать экземпляры любого класса с помощью этого метода я настоятельно рекомендую не делать этого и не следовать моему примеру внизу.

Импорт классов не оценивается во время выполнения.Вы должны использовать полный путь к классу, чтобы динамически создать его экземпляр, как показано в этом примере:

<?php

namespace One {
    use Two\B;

    class A {
        function __construct($className) {
            echo "Attempting to construct $className..";
            new $className;
        }
    }

    new A(B::class); // Works since the B import is evaluated before runtime.
    try {
        new A("B"); // Doesn't work since "B" is not evaluated until runtime
    }
    catch (\Throwable $e) {
        echo $e->getMessage() . "\n";
    }
    new A("Two\B"); // Works since you use the full path to B.
}

namespace Two {
    class B {
        function __construct() {
            echo "B constructed!\n";
        }
    }

}

https://3v4l.org/LTdQN


Хотя вы можете сделать это, этопросить неприятностей.Что может помешать кому-либо извлекать данные из какой-либо модели, к которой у него нет доступа?

Вместо этого создайте массив доступных классов и разрешите ему передавать ключ массива вместо того, чтобы передавать имя класса.

$classes = [
   'a' => AAA::class,
   'b' => BBB::class,
   'c' => CCC::class,
];

// $from_input being a, b, or c
if (isset($classes[$from_input])) {
   $obj = new $classes[$from_input];
}
...