Не могу подключить класс, имя которого передаётся через параметр (laravel)
Выдаёт ошибку: Class 'story' not found.
Пробовал первую букву большую - не помогло.
маршрут:
Route::get('/new/sorttopforever/{item?}/{sort?}', 'IndexController@sortTopForever')
->name('sorttopforever');
модель:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Story extends Model
{
protected $table = 'story';
}
контроллер:
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Collection;
use App\Bezdna;
use App\Story;
class IndexController extends Controller
{
public function sortTopForever($item, $sort)
{
//вот так не работает $elems = $item::all();
if ($item == 'story')
$elems = Story::all();
if ($item == 'bezdna')
$elems = Bezdna::all();
$elems = $elems->sortByDesc($sort);
$elems = $elems->values()->all();
return view('story.show', [
'elems' => $elems,
'key' => Auth::check() ? true : false,
'item' => 'story'
]);
}
}
Ответы (2 шт):
Скорее всего не приходят аргументы в метод, или приходят не те значения, что Вы ждёте. Попробуйте воспользоваться dd() или dump(), чтобы проверить значения переменных $item и $sort:
...
public function sortTopForever(string $item, string $sort)
{
dd("\$item = '$item'; \$sort = '$sort';")
if ($item === 'story') {
$elems = Story::all();
} elseif ($item === 'bezdna') {
$elems = Bezdna::all();
} else {
...
}
...
PS: Не претендую на ответ - здесь просто можно писать код, в отличие от комментариев.
PPS: Извиняюсь за занудство, но настоятельно рекомендую оборачивать блоки кода в фигурные кавычки и придерживаться соглашения сообщества о наименовании - код будет значительно проще и читабельнее.
вот так не работает $elems = $item::all();
У тебя класс находится в App. Добавь перед
$elems = $item::all();
что-то в духе
$item = 'App\' . ucfirst($item)
PS. Вангую что проблема гораздо бОльше, и кроется в bad design, а сабж так, следствие и симптоматика. На будущее, посвяти пару-тройку предложений в вопросе тому, что хочешь сделать. А - тебе могут предложить альтернативный способ решения проблемы, Б - людям будет легче понять истоки проблемы.
PPS. Мой ответ решает конкретно твой затык с вызовом класса. Использовать такую конструкцию как у тебя - плохо.