• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Laravel odwołanie do nieistniejącego obiektu

Object Storage Arubacloud
0 głosów
478 wizyt
pytanie zadane 26 marca 2019 w PHP przez Grzegorz Mikina Dyskutant (8,060 p.)
@extends('template')
 @section('title')
    @if (isset($title))
      - {{ $title }}
    @endif
 @endsection

@section('content')
<div class="container">
<div class="card">
<div class="card-header">
{{ $doctor->name }}
</div>
<div class="card-body">
    <table class="table">
        <tr>
            <td>Name:</td>
            <td>{{ $doctor->name }}</td>
        </tr>
        <tr>
            <td>Email:</td>
            <td>{{ $doctor->email }}</td>
        </tr>
        <tr>
            <td>Phone:</td>
            <td>{{ $doctor->phone }}</td>
        </tr>
        <tr>
            <td>Address:</td>
            <td>{{ $doctor->address }}</td>
        </tr>
        <tr>
            <td>Status:</td>
            <td>{{ $doctor->status }}</td>
        </tr>
        <tr>
            <td>Specializacje:</td>
              <td>
                <ul>
                        @foreach ($doctor->specializations as $specialization)
                        <li>{{ $specialization->name }}</li>
                        @endforeach
                </ul>
              </td>
        </tr>
    </table>
</div>
</div>
</div>
@endsection('content')

Jak sprawić żeby zmienne name email phone status... były obiektami, widziałem gdzieś wpis że trzeba je podać w tablicy? 

ErrorException (E_ERROR)
Trying to get property 'name' of non-object (View: C:\xampp\htdocs\laravel\laravel\resources\views\doctors\show.blade.php)
Previous exceptions
Trying to get property 'name' of non-object (0)

show.blade.php

C:\xampp\htdocs\laravel\laravel\storage\framework\views\e2146825e8a90ff9eabbd8d31c3148574c8e7da1.php
 <?php $__env->startSection('title'); ?>
    <?php if(isset($title)): ?>
      - <?php echo e($title); ?>
 
    <?php endif; ?>
 <?php $__env->stopSection(); ?>
 
<?php $__env->startSection('content'); ?>
<div class="container">
<div class="card">
<div class="card-header">
<?php echo e($doctor->name); ?>     <<<<<======================
 
</div>
<div class="card-body">
    <table class="table">
        <tr>
            <td>Name:</td>
            <td><?php echo e($doctor->name); ?></td>
        </tr>
        <tr>
            <td>Email:</td>
            <td><?php echo e($doctor->email); ?></td>
        </tr>
        <tr>
            <td>Phone:</td>
            <td><?php echo e($doctor->phone); ?></td>
        </tr>
        <tr>
            <td>Address:</td>
            <td><?php echo e($doctor->address); ?></td>
        </tr>
        <tr>
            <td>Status:</td>
            <td><?php echo e($doctor->status); ?></td>
        </tr>
        <tr>
            <td>Specializacje:</td>
              <td>
                <ul>
Arguments
"Trying to get property 'name' of non-object (View: C:\xampp\htdocs\laravel\laravel\resources\views\doctors\show.blade.php)"

 

komentarz 26 marca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Pokaż co przekazujesz w kontrolerze do widoku pod zmienną $doctor. Prawdopodobnie nie ma tam obiektu, a jakaś inna wartość (nie obiekt).
komentarz 26 marca 2019 przez Grzegorz Mikina Dyskutant (8,060 p.)
BaseRepository.php
<?php

namespace App\Repositories;

use Illuminate\Database\Eloquent\Model;

abstract class BaseRepository
{
    protected $model;

    public function getAll($columns = array('*'))
    {
        return $this->model->get($columns);
    }
    public function create($data)
    {
        return $this->model->create($data);
    }
    public function update($data, $id)
    {
        return $this->model->where("id", '=', $id)->update($data);
    }
    public function delete($id)
    {
        return $this->model->destroy($id);
    }
    public function find($id)
    {
        return $this->model->find($id);
    }
}

DoctorController.php
 

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\User;

use App\Models\Specialization;

use App\Repositories\UserRepository;


class DoctorController extends Controller
{
    public function index(UserRepository $userRepo)
    {
        $statistics = $userRepo->getDoctorsStatistics();

        $users = $userRepo->getAllDoctors();

        
        return view('doctors.list', [
            "doctorsList" => $users,
            "footerYear" =>  date("Y"),
            
            "title" => "Moduł lekarzy",
            "statistics" => $statistics
        ]);
    }
    public function listBySpecialization(UserRepository $userRepo, $id)
    {
        $statistics = $userRepo->getDoctorsStatistics();

        $users = $userRepo->getDoctorsBySpecialization($id);

        
        return view('doctors.list', [
            "doctorsList" => $users,
            "footerYear" =>  date("Y"),
            
            "title" => "Moduł lekarzy",
            "statistics" => $statistics
        ]);
    }

    public function show(UserRepository $userRepo, $id)
    {
        $doctor = $userRepo->find($id);


        
        return view('doctors.show', [
            "doctor" => $doctor,
            "footerYear" =>  date("Y"),
            
            "title" => "Moduł lekarzy"
        ]);
    }
    public function create()
    {
        
        $specializations = Specialization::all();
        return view('doctors.create', [
            "specializations" => $specializations,
            "footerYear" => date("Y"),
            "title" => "Panel tworzenia nowego lekarza"
        ]);
    }
    public function store(Request $request)
    {
        $doctor = new User;
        $doctor->name = $request->input('name');
        $doctor->email = $request->input('email');
        $doctor->password = bcrypt($request->input('password'));
        $doctor->phone = $request->input('phone');
        $doctor->address = $request->input('address');
        $doctor->pesel = $request->input('pesel');
        $doctor->status = $request->input('status');
        $doctor->type = 'doctor';
        $doctor->save();

        $doctor->specializations()->sync($request->input('specializations'));
        return redirect()->action('DoctorController@index');
    }
    public function edit(UserRepository $userRepo, $id)
    {
        $doctor = $userRepo->update(["name" => "Johnson Allan"], $id);

        return redirect('doctors');
    }
    public function delete(UserRepository $userRepo, $id)
    {
        $doctor = $userRepo->delete($id);
        return redirect('doctors');
    }
}

 

komentarz 26 marca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)

To w metodzie show problem? Wychodzi więc, że po pobraniu tu:

$doctor = $userRepo->find($id);

$doctor nie jest obiektem. Sprawdź co to zwraca.

komentarz 26 marca 2019 przez Grzegorz Mikina Dyskutant (8,060 p.)
public function show(UserRepository $userRepo, $id)

{

$doctor = $userRepo->find($id);

 

return view('doctors.show', [

"doctor" => $doctor,

"footerYear" => date("Y"),

"title" => "Moduł lekarzy"

]);

}
komentarz 26 marca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
No to już pokazałeś wyżej, ja tylko dopytałem czy chodzi o show i jeśli tak to sprawdziłbym co zwraca linia podana powyżej, że nie ma tam obiektu.
komentarz 26 marca 2019 przez Grzegorz Mikina Dyskutant (8,060 p.)
Jak mogę to sprawdzić ?
komentarz 26 marca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Jakkolwiek, nawet robiąc dd albo var_dump zmiennej $doctor, aby podejrzeć na szybko co tam jest.
komentarz 26 marca 2019 przez Grzegorz Mikina Dyskutant (8,060 p.)
Nic to proszę Pana nie daje. zarówno var_dump jak i dd(); Nawet gdy usunę reszte skryptu. Var damp jest normalnie omijany. DD również.
Tu jest link do Gita, autor kursu zmienia przekierowanie w pliku connection.php ja natomiast zrobiłem to w xampp'a index.php. https://gitlab.com/spooky001/kurs-laravel

Nie mam już pomysłu. Poprzenosiłem sobie poszczególne pliki z GITa na swój projekt i nic. Dalej te same błędy.

jedynynie jak pousuwałem wszystkie te znaki (\{\{ oraz \}\} to wtedy skrypt dopiero pod koniec sie urywał w pętli foreach
komentarz 26 marca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Nie wiem proszę Pana co Pan robi ;) Nie wiem o jakie przekierowanie chodzi. Nie wiem też jakie znaki usuwasz i skąd się tam biorą.

Komunikat błędu mówi: próbujesz odwołać się do właściwości obiektu nie na obiekcie. Jasne chyba jest, że to się nie może udać? Skoro nie jest to obiekt to nie da się go potraktować jak obiektu i zrobić z nim tego samego co z obiektem. Proste. Jeśli dobrze zrozumiałem fragmenty, które pokazałeś, to dotyczy to metody show i tego widoku. Robisz tam na widoku $doctor->name, a więc tym nie-obiektem jest $doctor.

Stąd zaproponowałem, abyś sprawdził co tam jest (co zawiera zmienna $doctor) i dlaczego nie ma tam obiektu. Możesz sobie przeanalizować kod tego repozytorium i ustalić czemu nie zwraca obiektu. Możesz podłączyć debugger i zobaczyć co po kolei robi. Możesz zrobić var_dump lub dd wartości. Obojętnie. Błąd jest bardzo prosty i jasny: chcesz użyć czegoś jak obiektu, a to nie obiekt. Pytanie tylko co dokładnie powoduje to, że tam nie ma obiektu, a jest coś innego.
1
komentarz 26 marca 2019 przez Grzegorz Mikina Dyskutant (8,060 p.)
Ok, dzięki za podpowiedź

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 416 wizyt
pytanie zadane 23 lipca 2018 w PHP przez kevin Mądrala (5,010 p.)
0 głosów
0 odpowiedzi 74 wizyt
pytanie zadane 7 listopada 2020 w PHP przez Bakkit Dyskutant (7,600 p.)
0 głosów
1 odpowiedź 233 wizyt
pytanie zadane 20 lutego 2019 w PHP przez Rocket Gaduła (3,030 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...