Итак, я хочу вернуть некоторую строку из 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(),
]);
});
Это не то, как вы настраиваете маршрут для использования этого метода контроллера. Еще раз проверьте документацию: laravel.com/docs/10.x/routing#basic-routing. Должно быть Route::get('/about', [AboutController::class, 'info']);
. Ваш код возвращает представление, но вы не передаете ему $a
или $b
. И @JeremyHarris прав; метод Controller должен быть не статическим, а public function info()
; Однако модель в основном не имеет отношения к вашему вопросу.
@JeremyHarris, потому что, когда я удаляю его, появляется ошибка Non-static method App\Http\Controllers\AboutController::info() cannot be called statically
Где вы увидели этот синтаксис? Это было в учебнике или что-то в этом роде? Потому что это совершенно неправильно для того, как вы используете маршруты и контроллеры в Laravel 😅
@TimLewis хорошо работает в различных учебниках, потому что, когда я делаю базовый и следую документам, он всегда не работает.
Ваш код должен работать как public function info(){ ... });
и Route::get('/about', [AboutController::class, 'info']);
; уберите static
и скорректируйте маршрут; все остальное в порядке. Это работает или нет?
@TimLewis он вернет эту ошибку Non-static method App\Http\Controllers\AboutController::info() cannot be called statically
Однако я обнаружил проблему, я ошибся, объявив свою модель в своем контроллере, я меняю ее на $model = new AboutModel(); $a = $model->Info();
и меняю маршрут на основе того, что вы сказали, и он работает нормально
О, это, наверное, отдельная тема. У вас есть public static function Info(){
, но вы делаете AboutModel::info();
; Info
против info
🙂
@TimLewis ах, да, тоже опечатка, даже в этом случае, когда я исправляю опечатку, она также возвращает эту ошибку Non static method 'Info' should not be called statically.
из-за неправильного объявления модели для переменной
@RaflyAndrian удалите static из метода информации о контроллере, оставьте static в методе информации о модели и используйте объявление маршрута, прокомментированное TimLewis выше. Вы не должны получить никакой ошибки.
контроллер никогда не запускается, работает только обратный вызов в файле 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;
}
Почему вы используете функции
static
?