Giriş yapmadınız.

Duyuru

TÜRKÇE KİTAP DUYURUSU:
Laravel 5 : Laravel 5.1 Güzelliği (Türkçe)
Vue.js 2 : Vue.js 2 Majesteleri (Türkçe)

#1 23.12.2018 16:18:55

furkanaksoy
Üye
Yer: İstanbul
Kayıtlı: 27.12.2016
Mesajlar: 52

static controller kullanımı

selamlar,
http://prntscr.com/lymf1z
aylardır uğraştığım bu şekilde bir projem var. sürekli geliştirmeye çalışıyorum. çalışırken aklıma bir şey takıldı. şimdi bu sayfada menü barı layout ve kırmızıyla seçili olan yerlerin her biri farklı bir sayfa. menü barında şehirler, kategoriler ve  user tablolarından farklı veriler var. ben her sayfa oluşturduğumda bu verileri bir değişkenle blade'e göndermem gerekiyor. şuanda public ile yapıyorum bunu fakat her fonction'a bunları yazmak saçma geliyor. bunu static olarak yapmanın bir yolu var mıdır?
controller dosyam;

public function dashboard()
    {
        $user = Auth::user('name');
        $cities = Cities::all();
        $specialitys = Speciality::all();
        return view('user.dashboard', compact('cities','specialitys','user'));
    }
    public function profile()
    {
        $user = Auth::user('name');
        $cities = Cities::all();
        $specialitys = Speciality::all();
        return view('user.profile', compact('cities','specialitys','user'));
    }
    public function message()
    {
        $user = Auth::user('name');
        $cities = Cities::all();
        $specialitys = Speciality::all();
        return view('user.message', compact('cities','specialitys','user'));
    }
    public function password()
    {
        $user = Auth::user('name');
        $cities = Cities::all();
        $specialitys = Speciality::all();
        return view('user.password', compact('cities','specialitys','user'));
    }
    public function appointments()
    {
        $user = Auth::user('name');
        $cities = Cities::all();
        $specialitys = Speciality::all();
        return view('user.appointments', compact('cities','specialitys','user'));
    }
    public function likes()
    {
        $user = Auth::user('name');
        $cities = Cities::all();
        $specialitys = Speciality::all();
        return view('user.likes', compact('cities','specialitys','user'));
    }
    public function comments()
    {
        $user = Auth::user('name');
        $cities = Cities::all();
        $specialitys = Speciality::all();
        return view('user.comments', compact('cities','specialitys','user'));
    }

Çevrimdışı

#2 23.12.2018 17:33:04

elementaryos
Üye
Kayıtlı: 20.04.2017
Mesajlar: 168

Yanıt: static controller kullanımı

providers/AppServiceProvider içine yada RouteServiceProvider şeklinde siz yeni açın
Her sayfada algılanacak değişkenleri eklerseniz buraya dosyaların her birinde bu küresel değişkenleri tekrar tekrar tanımlanması gerekmez.

      view()->composer('*', function ($view) {

      $admin_url = env('APP_URL').'/admin';
      $auth = Auth::user();
     
     // $categories = Category::where('locale',getLang())->paginate(getPag());
 
      $view
      ->with('auth', $auth)
      ->with('admin_url', $admin_url)
    //  ->with('categories', $categories);
      ;

      // Belki sonradan değiştirmek isteyebiliriz. 
      $links = [
      'category'          => 'Category',
      'page'              => 'Pages',
      'categories'        => 'Categories',
      'pages'             => 'Pages',
      ];
  
      $view
      ->with('links', $links);



      });

Zaten buna gerek bırakmadan anlatmak gerekirse bu çok gereksiz bir durum.
View() olarak göndermeyin. O sayfaya yönlendirin böylece, bir sayfanın değişşkenlerini yazdınız. Diğer sayfaya gönderirken o sayfaya ait değişkenleri tekrar tanımlamanız gerekmez.

Çevrimdışı

#3 23.12.2018 17:41:33

furkanaksoy
Üye
Yer: İstanbul
Kayıtlı: 27.12.2016
Mesajlar: 52

Yanıt: static controller kullanımı

direk yönlendirmeden kastınız

return redirect()

komutu mu? bu şekilde undefined variable hatası alıyorum. controllerı şu şekilde düzenledim:

public function profile()
    {
        return redirect('hesabim/profile');
    }

routs.php:

/* User Pages */
Route::middleware('auth')->group(function(){
    Route::get('hesabim', '[email protected]')->name('user-dashboard');
    Route::get('hesabim/profil', '[email protected]')->name('user-profile');
    Route::get('hesabim/mesaj', '[email protected]')->name('user-message');
    Route::get('hesabim/sifre', '[email protected]')->name('user-password');
    Route::get('hesabim/randevularim', '[email protected]')->name('user-appointments');
    Route::get('hesabim/begendiklerim', '[email protected]')->name('user-likes');
    Route::get('hesabim/yorumlarım', '[email protected]')->name('user-comments');
});

Son düzenleyen furkanaksoy (23.12.2018 17:42:27)

Çevrimdışı

#4 23.12.2018 17:56:17

elementaryos
Üye
Kayıtlı: 20.04.2017
Mesajlar: 168

Yanıt: static controller kullanımı

Sürekli değişken atamak her sayfada aynılarını hem yorucudur hemde içinden çıkılmaz bir baş ağrısıdır sebebi de geliştiricilerden kaynaklıdır.
En önemli kurallardan biri programlamada "kendini tekrar etme"
Eğer her sayfada kullanlan menu gibi değişkenler varsa bunları hizmet sağlayacılar üstlenebilir. Fakat başka bir yere yönlendirmek isterseniz o sayfaya ait değişkenleri controller içinde vermeniz doğru olmaz.

return redirect()->action('[email protected]');
return redirect()->route('profile');

Şeklinde rotaya ya da dışarıdan yönlendirirmiş gibi yönlendirmeniz gerekmekte. Şuan izah edemeyecek olsamda view ile göndermenin sıkıntıları mevcut. Yönlenen sayfada yenileme yaptığınızda önceki sayfaya yönlendirmesi ve post işlemi gibi algılaması ve eğer güncellenmişse bile güncelleme olmadan görünmesi gibi.

Çevrimdışı

#5 23.12.2018 18:06:58

furkanaksoy
Üye
Yer: İstanbul
Kayıtlı: 27.12.2016
Mesajlar: 52

Yanıt: static controller kullanımı

'dashboard' sayfasından 'profile' sayfasına geçiş yapacağım. bu yönlendirme kullanımları ile nasıl yapacağımı anlamadım.

return redirect()->action('[email protected]');

bu direk anasayfaya yönlendiriyor.

return redirect()->route('user-profile');

2.sinde ise bu şekilde yazdığımızı varsayarsak zaten aynı sayfadayım.
lütfen kusuruma bakmayın biraz daha detaylı anlatabilir misiniz?

Çevrimdışı

#6 23.12.2018 18:19:53

elementaryos
Üye
Kayıtlı: 20.04.2017
Mesajlar: 168

Yanıt: static controller kullanımı

Tabi homeController ve user-profile sadece birer örnek. Sizin daha önceden oluşturduğunuz route ile ya da sayfaya yönlendirme yapmanız anlamına geliyor. Eğer view ile sayfaya tekrar yönlendirme yaparsanız değişkenleri de tekrar tekrar her method içinde sürüsüne bereket eklemeniz anlamına gelir.
Bunu edit,index değil de create,store olarak düşünmelisiniz. Her sayfa kendine ait değişkenlerini aldığı bir methoda bağlı olmalı. Bu sadece SAYFA tekrarlarından kurtulmak için. Bir de her sayfada menü gibi değişkenler varsa bunlar içinde global olarak view()->share ile paylaşıyoruz tüm sayfalar ile. Diğerleri normal devam ediyor.

Örnek route ile yönlendirdiğinizde o route'a ait methoddan değişkenleri alacak ve yönlenecektir aksi halde tekrardan sizin değişkenleri çağırıp işlemleri yaptırıp sayfaya götürmeniz gerekecekti. Bu da her method için düşünülürse büyük bir işkence. İnşaAllah bu sefer anlaşılabilir olmuştur.

Çevrimdışı

#7 23.12.2018 18:30:16

furkanaksoy
Üye
Yer: İstanbul
Kayıtlı: 27.12.2016
Mesajlar: 52

Yanıt: static controller kullanımı

controller:

public function dashboard()
    {
        $user = Auth::user('name');
        $cities = Cities::all();
        $specialitys = Speciality::all();
        return view('user.dashboard', compact('cities','specialitys','user'));
    }
    public function profile()
    {
        $user = Auth::user('name');
        $cities = Cities::all();
        $specialitys = Speciality::all();
        return redirect()->route('user-dashboard');
    }

blade kodu:

<ul>
                                        <li><a href="{{ route('user-dashboard') }}" class="user-profile-act"><i class="fa fa-gears"></i>Hesabım</a></li>
                                        <li><a href="{{ route('user-profile') }}"><i class="fa fa-user-o"></i> Profilimi Düzenle</a></li>
                                        <li><a href="{{ route('user-message') }}"><i class="fa fa-envelope-o"></i> Mesajlarım <span>3</span></a></li>
                                        <li><a href="{{ route('user-password') }}"><i class="fa fa-unlock-alt"></i> Şifremi Değiştir</a></li>
                                        <li><a href="{{ route('user-appointments') }}"> <i class="fa fa-calendar-check-o"></i> Randevularım <span>2</span></a></li>
                                        <li><a href="{{ route('user-likes') }}"><i class="fa fa-th-list"></i> Beğendiklerim</a></li>
                                        <li><a href="{{ route('user-comments') }}"><i class="fa fa-comments-o"></i> Yorumlarım</a></li>
                                        <hr>
                                        <li><a href="{{ url('panel') }}"><i class="fa fa-user-secret"></i> Panel</a></li>
                                    </ul>

sayfalarım bu şekilde. ilk resimde attığım sayfa ''dashboard' blade'i. dashboard'dan 'profile' blade'ine tıkladığımda 'user,specialitiys,cities' değişkenlerini gönderebileceğim basit bir örnek yazabilir misiniz. inanın hala daha anlamadım big_smile

Son düzenleyen furkanaksoy (23.12.2018 18:31:27)

Çevrimdışı

#8 23.12.2018 21:50:51

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 376

Yanıt: static controller kullanımı

saçma zaten, hep tekrar etmişsiniz aynı kod parçalarını.refactore uygun bir yapı değil.2 kez tekrar edince bile oturup düşünmelisiniz.bu böyle olmaz diye.
doğru yoldasınız..sorunuzun cevabı view.composer


Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

#9 23.12.2018 23:53:39

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,423
Website

Yanıt: static controller kullanımı

Diğer bir yol ise:

<?php

namespace App\Widgets;

use App\Cities;
use Illuminate\Contracts\Support\Htmlable;

class CitiesWidget implements Htmlable
{
    public function toHtml()
    {
        $cities = Cities::all();

        return view('widgets.cities', compact('cities'))->render();
    }
}

view/widgets/cities.blade.php

<ul>
@foreach($cities as $city)
    <li>{{ $city->name }}</li>
@endforeach
</ul>

Sonra herhangi bir şablonda şehir listesini göstermek istediğiniz yerde:

<div class="sidebar">
    {!! app(\App\Widgets\CitiesWidget::class)->toHtml() !!}
</div>

Bu yöntemin view composer'dan farkı \App\Widgets\Cities sınıfına __construct eklerseniz veriyi ekrana basmadan önce parametre göndererek farklı işlemler yaptırabilirsiniz.

Çevrimdışı

Forum alt kısmı