Неопределенная переменная в блейде при передаче переменной из контроллера Laravel

Итак, я хочу вернуть некоторую строку из model и controller, но она всегда говорит о неопределенной переменной, хотя она прошла успешно, когда я проверяю ее с помощью dd($a) и dd($b). Что я сделал не так ?

about.blade:

@extends('layout.template');
@section('homeContainer');

<p> {{ $a }} </p>
<br>
<p>{{ $b }}</p>
@endsection

AboutController :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\AboutModel;

class AboutController extends Controller
{
    //
    public static function info(){
        $a = AboutModel::info();
        $b = "This data is from controller";
    

        return view('about', compact('a', 'b'));
    }
}

AboutModel :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class AboutModel extends Model
{
    use HasFactory;
    
    public static function Info(){
        $a = "This value is from model";
        return $a;
    }
}

Routes :

<?php


use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AboutController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});



Route::get('/about', function () {
    return view('about', [
        "name" => AboutController::info(),
    ]);
});

Почему вы используете функции static?

Jeremy Harris 30.03.2023 20:56

Это не то, как вы настраиваете маршрут для использования этого метода контроллера. Еще раз проверьте документацию: laravel.com/docs/10.x/routing#basic-routing. Должно быть Route::get('/about', [AboutController::class, 'info']);. Ваш код возвращает представление, но вы не передаете ему $a или $b. И @JeremyHarris прав; метод Controller должен быть не статическим, а public function info(); Однако модель в основном не имеет отношения к вашему вопросу.

Tim Lewis 30.03.2023 20:57

@JeremyHarris, потому что, когда я удаляю его, появляется ошибка Non-static method App\Http\Controllers\AboutController::info() cannot be called statically

Rafly Andrian 30.03.2023 21:00

Где вы увидели этот синтаксис? Это было в учебнике или что-то в этом роде? Потому что это совершенно неправильно для того, как вы используете маршруты и контроллеры в Laravel 😅

Tim Lewis 30.03.2023 21:01

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

Rafly Andrian 30.03.2023 21:09

Ваш код должен работать как public function info(){ ... }); и Route::get('/about', [AboutController::class, 'info']);; уберите static и скорректируйте маршрут; все остальное в порядке. Это работает или нет?

Tim Lewis 30.03.2023 21:12

@TimLewis он вернет эту ошибку Non-static method App\Http\Controllers\AboutController::info() cannot be called statically Однако я обнаружил проблему, я ошибся, объявив свою модель в своем контроллере, я меняю ее на $model = new AboutModel(); $a = $model->Info(); и меняю маршрут на основе того, что вы сказали, и он работает нормально

Rafly Andrian 30.03.2023 21:15

О, это, наверное, отдельная тема. У вас есть public static function Info(){, но вы делаете AboutModel::info();; Info против info 🙂

Tim Lewis 30.03.2023 21:18

@TimLewis ах, да, тоже опечатка, даже в этом случае, когда я исправляю опечатку, она также возвращает эту ошибку Non static method 'Info' should not be called statically. из-за неправильного объявления модели для переменной

Rafly Andrian 30.03.2023 21:38

@RaflyAndrian удалите static из метода информации о контроллере, оставьте static в методе информации о модели и используйте объявление маршрута, прокомментированное TimLewis выше. Вы не должны получить никакой ошибки.

N69S 30.03.2023 21:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
10
117
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

контроллер никогда не запускается, работает только обратный вызов в файле web.php. это означает, что у вас нет переменных a и b, а только переменная имени

Объявление маршрута неверно. Маршрут не может обрабатывать обработанный блейд-код в качестве ответного ответа. Пожалуйста, проверьте приведенный ниже код для файла web.php.

<?php
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\AboutController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', function () {
   return view('welcome');
});
 
Route::get('/about', [AboutController::class, 'info'])->name("info");

Остальной код в порядке. Это сработает для вас.

В web.php вы должны написать следующий код:

Route::get('/about',[AboutController::class,'info']);
Ответ принят как подходящий

Спасибо за ответы!, оказалось, я ошибся, объявив модель как переменную и маршруты,

для маршрутов я меняю его на

Route::get('/about',[AboutController::class,'info']);

а для контроллера и модели удаляю статику и меняю объявление модели

Controller :

 public function info()
    {
        $model = new AboutModel();
        $a = $model->Info();
        $b = "This data is from controller";

        return view('about', compact('a', 'b'));
    }

Model :

public function Info(){
        $a = "This value is from model";
        return $a;
    }

Другие вопросы по теме