Giriş yapmadınız.

#1 28.06.2019 14:28:36

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

Selamlar,

Laravel 5.8'in gücü ile geliştirdiğim projeyi dün gece bitirdim, bir e-ticaret veya forum sitesi değil basit kurumsal bir web sitesinin ihtiyaçlarına göre tasarladım ve iyi özelliklere sahip olduğuna inanıyorum.

Ancak yaşadığım şehirde laraveli uzman düzeyde bilen kimse yok varsa da eğer araştırmama rağmen bulamadım. O yüzden yardımlarınıza ihtiyacım var.

Henüz bitirdiğim bu projeyi nasıl test edebiliriz ? Sizden geri dönüş alabilir miyim ? Gerekirse kaynak kodları paylaşabilirim, yüklü paketleri paylaşabilirim, subdomain ile örnek bi admin paneli de açabilirim. Projeye önümüzdeki haftalarda onesignal ve tawk'ı dahil etmeyi düşünüyorum. Config dosyalarını görseniz çok iyi olurdu.

Çevrimdışı

#2 28.06.2019 15:29:43

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

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

Özel değilse eğer içerisindeki kullanıcı adı, şifre, mail şifreleri, veritabanı bilgileri, APP_KEY vs. gibi bilgileri kaldırıp Github'a atın, bakalım.

Çevrimdışı

#3 28.06.2019 20:59:02

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

mgsmus yazdı:

Özel değilse eğer içerisindeki kullanıcı adı, şifre, mail şifreleri, veritabanı bilgileri, APP_KEY vs. gibi bilgileri kaldırıp Github'a atın, bakalım.

https://github.com/dlpnt/demoDev

Hocam google analytics paketiyle ilgili hata aldığım için bir önceki versiyonu yükledim, onun dışında eksiklerim olmasına rağmen olumlu cevap vereceğine inanıyorum heyecanla bekliyorum.

Son düzenleyen neri (28.06.2019 21:01:02)

Çevrimdışı

#4 29.06.2019 10:59:15

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

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

Müsait zamanda bakıp dönüş yapacağım.

Çevrimdışı

#5 29.06.2019 11:04:03

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

mgsmus yazdı:

Müsait zamanda bakıp dönüş yapacağım.

Tamam hocam.

Çevrimdışı

#6 29.06.2019 11:09:51

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

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

Yazım stili olarak fena değil,business logic dışı değerlendirme yapıyorum şu an sana.
Tek eksik olarak kontrolcü methodların annotationlara sahip değil.Methodlarını ve propertylerini mutlaka annotationlarla besleyerek yazmalısın.
Onun dışında kontrolcülerin komple database bağımlısı.Bu ileride sorun yaratabilir sana refactoringte.Komplexitylerini değerlendirmelisin.

$delete = Blog::find($id);

değişken isimlendirmeni hatalı buldum.Blog::find iş yapma konsepti olarak delete ile isimlendirmemeli.$blog olabilir...

public function dataDelete(Request $request)
    {
        $id = $request->id;
        $delete = Blog::find($id);
        foreach ($delete->articles as $article) {
            foreach ($article->articlePics as $pic) {
                Storage::disk('uploads')->delete($pic->path);
                Picture::destroy($pic->id);
            }
        }
        $delete->delete();
        activity()->log('Blog silindi');
        return "ok";
    }

Örneğin bu methodda bir sıkıntı var.Her türlü ok string değer döndürüyorsun.
Hatalı olabilir.
storage deletede bir sorun olduğunda exception yakalamalısın yada database hatasında.
ve string değer yerine boolean bir değer döndürsen daha mantıklı olabilir.

Şimdilik bu kadar.


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

Çevrimdışı

#7 29.06.2019 11:50:56

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

@deathisonitsway vakit ayırıp incelediğin için teşekkür ederim üstat, düşünceleriniz benim çok kıymetli.

- Annotationlar kulağımda küpe
- Değişken isimlerini, deadline yetişsin diye copy paste için o şekilde koydum diğer kontrolcüye hızlıca yapıştırmak için düzeltmeliyim haklısınız
- Delete ve return işlemlerini gözden geçiricem

Kodları genel olarak refactor edicem, cevabınızda bir şeyi analyamadım, kontrolcülerin komple database bağımlısı demişsiniz bu kısımı tam olarak anlayamadım biraz açıklarsanız çok sevinirim ? Genel olarak kontrolcüleri CRUD işlemi için kullanmıyor muyuz yoksa başka bişeyden mi bahsettiniz ? Ne yapmam gerek ?

Çevrimdışı

#8 29.06.2019 17:14:29

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

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

Kontrolcüler elbette bir şeye bağımlı olacaklar.Bunda hiç bir sorun yok.Database bağımlısı derken ben bu şekil kontrolcü içinde doğrudan query kullanımını tehlikeli buluyorum.Bu bana göre bir değerlendirme tabi.Kücük yada büyük projelerin hemen hepsinde repository mantığını güttüğüm için benim kontrolcülerimde bu şekil de bir kullanım hiç kimse görmemiştir şimdiye kadar.

//repositoryServiceProvider.php

$this->app->bind(BlogRepositorInterface::class,BlogRepository::class);

Kontrolcü kullanımı:

/**
     * fetches any data from blog table
     *
     * @param BlogRepositoryInterface $blogRepository
     * @return mixed
     */
    public function index(BlogRepositoryInterface $blogRepository)
    {
         $postsLastYear = $blogRepository->getPostsLastYear();
    }

gibi.Ha şöyle de bir şey var artık.Ormler hayatımıza girdiğinden beri model eventlar,scopelar,resources,attribute gibi benzeri kavramlarla beraber geliyorlar artık.
Bunların doğru yönetimi model tarafında yapıldıktan sonrada,elbette ki kontrolcülerde refactor kısmında zorlanmayacağınız dinamik queryler yazılabilir.O yüzden ben bu türden bir yazımı red etmiyorum.Dağınık ve hoş görünmüyor benim gözüme sadece hepsi o.Ben bir tablonun tüm querylerini tek bir yerde görmek isteyenlerdenim.O yüzden bu yapıyı benimsedim hep.Sizin yazdığınız türden bir yaklasım beni korkutuyor.

Son düzenleyen deathisonitsway (29.06.2019 17:17:44)


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

Çevrimdışı

#9 29.06.2019 17:34:32

coder2
Üye
Yer: Antalya
Kayıtlı: 09.12.2018
Mesajlar: 53

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

deathisonitsway yazdı:

Kontrolcüler elbette bir şeye bağımlı olacaklar.Bunda hiç bir sorun yok.Database bağımlısı derken ben bu şekil kontrolcü içinde doğrudan query kullanımını tehlikeli buluyorum.Bu bana göre bir değerlendirme tabi.Kücük yada büyük projelerin hemen hepsinde repository mantığını güttüğüm için benim kontrolcülerimde bu şekil de bir kullanım hiç kimse görmemiştir şimdiye kadar.

//repositoryServiceProvider.php

$this->app->bind(BlogRepositorInterface::class,BlogRepository::class);

Kontrolcü kullanımı:

/**
     * fetches any data from blog table
     *
     * @param BlogRepositoryInterface $blogRepository
     * @return mixed
     */
    public function index(BlogRepositoryInterface $blogRepository)
    {
         $postsLastYear = $blogRepository->getPostsLastYear();
    }

gibi.Ha şöyle de bir şey var artık.Ormler hayatımıza girdiğinden beri model eventlar,scopelar,resources,attribute gibi benzeri kavramlarla beraber geliyorlar artık.
Bunların doğru yönetimi model tarafında yapıldıktan sonrada,elbette ki kontrolcülerde refactor kısmında zorlanmayacağınız dinamik queryler yazılabilir.O yüzden ben bu türden bir yazımı red etmiyorum.Dağınık ve hoş görünmüyor benim gözüme sadece hepsi o.Ben bir tablonun tüm querylerini tek bir yerde görmek isteyenlerdenim.O yüzden bu yapıyı benimsedim hep.Sizin yazdığınız türden bir yaklasım beni korkutuyor.


Hocam repository pattern kullanırken bazen service provider içinde singleton olarak ekliyorum fakat repository kullanacağım sınıf içinde ;

private $productRepository;

    public function __construct()
    {
        $this->productRepository = new ProductRepository();
    }

yukardaki mantık ile tanımlamak daha kolay geliyor.  Service provider içinde tanımlamak şart mı ?

Çevrimdışı

#10 29.06.2019 18:35:29

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

@deathisonitsway hocam teşekkür ederim açıkçası design pattern repository gibi konular benim gözümü hep korkutmuştu öğrenmek istesem bile odaklanamadım o yüzden bende dökümantasyondaki gibi basic bi kodlama yaptım hep. Ama önerilerin benim için çok önemli ben öğrenmeyi seviyorum şimdi istediğim şey tdd ile bi proje geliştirmek ve bu konular ile birlikte.

Son düzenleyen neri (29.06.2019 18:37:11)

Çevrimdışı

#11 29.06.2019 23:38:56

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

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

https://github.com/dlpnt/demoDev/blob/m … er.php#L31
Bu kısımda save işlemi boolean sonuç dönderir, çalışmayı kesmez. Admin oluşsun ya da oluşmasın Yönetici oluşturuldu şeklinde sanki işlem başarılı olmuş gibi devam ediyorsunuz. if($admin) ile kontrol edecekseniz o kısımda hata mesajı ile tekrar geri dönmelisiniz, devam etmemelisiniz. Genel olarak kodlarda bu şekilde davranmışsınız. Yani yarım işlem yapılsa bile uygulama devam ediyor ve sonuç olumlu dönüyor.

https://github.com/dlpnt/demoDev/blob/m … re.php#L30
Bakın burada role sadece gerekli ama bir sınırlama yok, sadece şu roller girilebilir gibi bir sınırlama yapmamışsınız ve role değeri kullanıcı tarafından belirleniyor. Bu dışarıdan bir müdahale ile suistimal edilebilir.

https://github.com/dlpnt/demoDev/blob/m … re.php#L27
Aynı şekilde blog_id gerçekten bir Blog'a mı ait kontrol edilmemiş. Olmayan bir blog_id'si işlenebilir.

https://github.com/dlpnt/demoDev/blob/m … er.php#L67
Bu tür şeyleri ayrı bir servise dönüştürün. Örneğin app/Services/SchemaGenerator.php gibi. Daha sonra bunu detail() yöntemine enjekte ederek kullanırsınız. Olabildiğince controller yöntemleri hafif ve bağımsız olsun.

https://github.com/dlpnt/demoDev/blob/m … er.php#L32
Bu kısımda $tags = $data->tags->implode('name', ', ') yapabilirsiniz sanırım.

https://github.com/dlpnt/demoDev/blob/m … er.php#L97
Model event kullanarak Article silindiğinde alakalı dosyaların da otomatik silinmesini ya da Blog silindiğinde alakalı Article'ların silinmesini sağlayabilirsiniz. Sanırım Article sildirmeyi de unutmuşsunuz. Blog silinince alakalı Article'lar öksüz kalıyor.

https://github.com/dlpnt/demoDev/blob/m … r.php#L108
Bu kısım şöyle olabilir, sonuçta ilişki kurmuşsunuz:

$article = Article::findOrFail($request->article_id);

$comment = new Comment([
    'name' => $request->name;
    'content' => $request->content;
    'votes' => $request->votes;
]);
$article->articleComments()->save($comment);

return back()->with('success', 'Yorum başarıyla kaydedildi!');

Genel olarak iyi, elinize sağlık.

Ben de Controller/Database bağımlılığından bahsetmek istiyorum.

Sizin uygulamada şöyle bir durum var, örneğin bir Blog oluşturmanın tek yolu BlogController::store() yöntemi ve bunu da POST /yeni-blog-kategorisi-olustur ile sağlayabiliyorsunuz. Sonuç olarak da bir redirect alıyorsunuz.

deathisonitsway'in dediği gibi yapsaydınız şöyle olacaktı örneğin:

public function store(BlogStore $request, BlogRepositoryInterface $blogRepository)
{
    $blog = $blogRepository->create([
        'name' => $request->name,
        'slug' => str_slug($request->name),
        'description' => $request->description
    ]);

    // ...
}

Ben bu sisteme bir de API yazsaydım, örneğin Api\BlogController::store() içerisinde yine BlogRepositoryInterface kullanabilirdim ve Blog oluşturabilirdim. BlogRepository::create() içerisinde yaptığım değişiklikler de buna yansırdı ve API için redirect yaptırmayıp JSON sonuç dönderebilirdim ya da başka işlem yaptırabilirdim.
Şu haliyle aynı şeyleri Api\BlogController::store() tekrar yapmam gerekecek ama redirect yerine json response döndereceğim. Küçük bir iş olduğu için çok önemli değil diyelim.

Çevrimdışı

#12 30.06.2019 00:01:03

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

@mgsmus hocam vakit ayirip inceledigin icin oncelikle cok tesekkur ederim soylediklerini inceleyip daha saglikli bir hale getirmeye calisicam projeyi. @deathisonitsway ustatta olumlu yorumlar yapti tabiki duzeltmem gereken seyler oldugunu biliyorum. Umarim daha da iyi seyler yapabilirim. Uzman degiliz ama sizin uzmanliginizdan faydalanmak bize cok sey katiyor.

Vakit ayirip ilgilenen  ve cevap veren herkese gonulden tesekkur ederim.

Çevrimdışı

#13 30.06.2019 00:17:23

kazımkazim
Üye
Yer: İstanbul
Kayıtlı: 02.01.2019
Mesajlar: 36

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

mgsmus yazdı:

https://github.com/dlpnt/demoDev/blob/m … er.php#L31
Bakın burada role sadece gerekli ama bir sınırlama yok, sadece şu roller girilebilir gibi bir sınırlama yapmamışsınız ve role değeri kullanıcı tarafından belirleniyor. Bu dışarıdan bir müdahale ile suistimal edilebilir.

Merhabalar bende konuyu takip ediyordum da big_smile
benim projemde

<select name="role_id" class="form-control mb-10">
     <option value="1">Admin</option>
     <option value="2" selected="">Yazar</option>
</select>

öğeyi denetle kısmından mesela value kısmını 19 felan yazınca sync ile eklerken doğal olarak bulamıyor. ve bu hatayı veriyor

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails 

validate kısmında

 'role_id'        => 'required|numeric',

  yaptım ama validate kontrolü öncesinden database den role verilerini çekip $role->id == request->role_id ile if else gibi bir mantıkla mı yapmam lazım ?

Son düzenleyen kazımkazim (30.06.2019 00:19:43)

Çevrimdışı

#14 30.06.2019 03:30:24

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

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

Önce Role id'lerini çekin sonra in kuralını kullanın:
https://laravel.com/docs/5.8/validation#rule-in

$roleIds = Role::pluck('id');

return [
    'role_id' => 'required|in:'.$roleIds->implode(',')
];

// ya da benim sevdiğim şekliyle, tane tane:
return [
    'role_id' => [
        'required',
        Rule::in($roleIds)
    ]
]

Böylece role_id'sinin 1 ve 2 dışında değer almasına engel olmuş oldunuz.

Bunun için özel bir Rule da oluşturabilirsiniz, bu şekilde yaparsanız diğer yerlerde de kullanabilirsiniz:
https://laravel.com/docs/5.8/validation … le-objects

$php artisan make:rule ValidRole

app/Rules/ValidRole.php

class ValidRole implements Rule
{
    public function passes($attribute, $value)
    {
        return is_numeric($value) && (bool) Role::find($value)
    }

    public function message()
    {
        return 'Geçersiz rol';
    }
}
return [
    'role_id' => new ValidRole
]

Çevrimdışı

#15 30.06.2019 12:00:07

kazımkazim
Üye
Yer: İstanbul
Kayıtlı: 02.01.2019
Mesajlar: 36

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

bunu kullandım hocam çok ayrıntılı açıklamışsınız custom felan tam anlaşılcak şekil de çok teşekkürler yardım için.

// ya da benim sevdiğim şekliyle, tane tane:
return [
    'role_id' => [
        'required',
        Rule::in($roleIds)
    ]
]

Yaptıgım

        $role_ids = Role::pluck('id');

        $this->validate($request, [
            'name'           => 'required|max:240',
            'email'          => 'required|max:240|email|unique:users,email,' . $id,
            'password'       => 'nullable|max:240|confirmed|min:6',
            'cover'          => 'image|mimes:jpg,png,jpeg,gif|max:2048',
            'avatar'         => 'image|mimes:jpg,png,jpeg,gif|max:2048',
            'country'        => 'max:240',
            'date_of_birth'  => 'nullable|max:240|date_format:d-m-Y',
            'twitter'        => 'max:240',
            'instagram'      => 'max:240',
            'facebook'       => 'max:240',
            'google_plus'    => 'max:240',
            'headline'       => 'max:240',
            'biography'      => 'max:40000',
            'gender'         => 'nullable|numeric|max:2',
            'login_status'   => 'nullable|numeric|max:2',
            'role_id'        => [
                'required',
                'numeric',
                Rule::in($role_ids),
            ]
        ]);

Çevrimdışı

#16 30.06.2019 13:01:47

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

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

Son bir ekleme daha yapayım: Eğer sadece onaylamada yer alan alanları istiyorsanız Validator::validate() ayrıca dizi olarak onaylanan alanları dönderir:

$validated = $this->validate($request,[
    'name' => 'required|max:240',
    // ...
]);

$name = $validated['name'];

Model::create() kullanırken sadece onaylamadan geçen alanların eklenmesini istediğinizde işinize yarar, tekrar aynı değerlerle uğraşmazsınız.

$user = User::create($validated);

Çevrimdışı

#17 30.06.2019 14:09:47

kazımkazim
Üye
Yer: İstanbul
Kayıtlı: 02.01.2019
Mesajlar: 36

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

yeni bilgiler için teşekkürler.

Çevrimdışı

#18 30.06.2019 15:42:16

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

@mgsmus evet sagolun hocam yeni bilgiler icin.

Çevrimdışı

#19 01.07.2019 09:19:01

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

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

@coder2

private $productRepository;

    public function __construct()
    {
        $this->productRepository = new ProductRepository();
    }

böyle kullanıyorsan serviceProvidera gerek yok.Service providerlar container denilen nesne ile doğrudan irtibatlı olduğu için container kayıtlarının dertli toplu yapıldığı yer olarak nitelendirebiliriz.Tabi sadece bununla sınırlı değil.

serviceproviderlar

https://github.com/laravel/framework/bl … ovider.php

bu sınıfla genişletilir ve incelediğinizde bir çok methodu mevcut.Bunlar ekseri laravel outsource (paket vs..) işler için applicationunuza entegrasyon methodlarıdır.Ancak genel olarak laravele katkısı,çekirdekte de kullanıldığı gibi container kayıtlarıdır.

bu methodlar da bind ve singleton dır.İkisi arasındaki fark aslında görünürde yok gibidir.singleton methoduda bind methodunu çalıştırır esasen tek farkı shared değerini true gönderir.

https://github.com/laravel/framework/bl … r.php#L357

nedir peki shared değerinin true gönderilmesi.Aslında method izlenimi ile anlatmak isterim ama çok vaktim yok.Kısaca şöyle anlatayım.


https://github.com/laravel/framework/bl … r.php#L656

bu satırda o değer direkt olarak döndürülüyor.Yani şu demek.
Herhangi bir abstract değeri objesinle beraber containere bind yada singleton ettiğinizde laravelin tek sihiri

https://github.com/laravel/framework/bl … er.php#L36


/**
     * The container's bindings.
     *
     * @var array[]
     */
    protected $bindings = [];

bu diziye bunları kaydetmektir.Application nesnesi container ile genişletildiği için bu obje ve sahip olduğu propertyleri,laravelin başından sonuna kadar her yerinde okunabilir formattadır.

$this->app->singleton('test',function($app,$params){

return new Foo($app,$params);
});

$this->app->bind('test2',function($app,$params){

return new Foo2($app,$params);
});

yukarıdaki iki void tanımda aslında kayıt yapar.
Ve bu kayıtlar laravelin yaşam çemberinin ana damarıdır.Laravel tüm sistemini bu bindings propertysi üzerine inşa etmiştir.

peki bu kayıtlar nasıl çağrılır.

az öncede bahsettiğim gibi serviceproviderlar doğrudan serviceprovider sınıfı ile genişletilir ve bu sınıfa doğrudan application nesnesi construct olarak bind edilir..

https://github.com/laravel/framework/bl … n.php#L670

new $provider($this);

https://github.com/laravel/framework/bl … er.php#L48

/**
     * Create a new service provider instance.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function __construct($app)
    {
        $this->app = $app;
    }

$this->app mülkü doğrudan application nesnesini döndürür bize.yani kaydı ve okumayı direkt olarak bu mülk ile yapabiliyoruz.

Ancak serviceprovider nesnesinin olmadığı yerlerde napıcaz peki.application nesnesine nasıl ulaşıcaz.
bunun için laravel bize app() methodunu helper olarak sunmaktadır.

Serviceproviderin olmadığı yerlerde de container nesnesine kayıt ve okuma yapabiliriz..

app()->bind();

app()->singleton();

yalnız dikkat edilmesi gereken nokta,Cok onerilen bir şey değildir bu.Sadece kayıtları serviceprovider olarak kaydetmemiz daha mantıklıdır.
öbür türlü heryerde kayıt yapıldığında anti pattern bir mevzu ortaya cıkar ve neyin nerde oldugu cok belli olmaz.
Herşeyin yerli yerinde yapılması daha mantıklıdır..O yüzden serviceprovider dışı container kaydı yapılması çok onaylanan bir şey değildir.
laravel bu app() methodunu bize daha çok singleton ve bind icin değilde..daha cok make() methodunun kullanımı icin vermiştir diye düşünenlerdenim.

app() yerine resolve() de kullanabilirsiniz.İkiside aynı şey ikiside app() methoduna kullanıyor..resolve appın aliası denebilir.

Gelelim singleton ve bind arasındaki farka.

Uzun uzadıya methodsal anlatmıcam..Direkt olarak sonuc gosteriyorum..

class foo
{
    public $var;
}

class bar
{
    public $var;
}

// make bind()
$container = app();

$container->bind('foo');

//reading bindings property
$instance = $container->make('foo');
$instance->var = 'laravel1';

$instance2 = $container->make('foo');
$instance2->value = 'laravel2';

echo "Bind: $instance->var --- $instance2->var";

//make singleton()
$container->singleton('bar');

$instance = $container->make('bar');
$instance->var = 'laravelsingleton1';

$instance2 = $container->make('bar');
$instance2->var = 'laravelsingleton2'; 

echo "Singleton: $instance->var --- $instance2->var";

//results :

Bind: test --- test2

Singleton: test2 --- test2

Gördüğünüz gibi singleton kayıtta.obje direkt olarak

// If an instance of the type is currently being managed as a singleton we'll
        // just return an existing instance instead of instantiating new instances
        // so the developer can keep using the same objects instance every time.
        if (isset($this->instances[$abstract]) && ! $needsContextualBuild) {
            return $this->instances[$abstract];
        }

buradan döndürülüyor.

Neyse uzatmayalım.Az öncede dediğim gibi kayıtlar serviceprovider nesnesiyle yapılmalı ve app() yada resolve() yardımcı methodu kullanılarak ->make() methodu ile okunur...

burada tek bir ayrıntı var make methodu iki parametre alır bunlardan biri abstract olarak ulasılacak nesne,diğeride callback döndürülen singleton ve bind methodlarına parametre göndermek.

yani yukarıda yazdıgım singleton ve bind kullanımını çağırdığımızda.

app()->make('test',['x'=>'y'])->get();

//Foo.php

class Foo {

protected $params;

public function __construct($app,$params)
{

$this->params = $params;

}

public function get()
{
  return $this->params; //['x'=>'y']
}
}

Bilmem anlatabildim mi.
İyi çalışmalar.

Son düzenleyen deathisonitsway (01.07.2019 09:21:09)


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

Çevrimdışı

#20 01.07.2019 14:11:02

coder2
Üye
Yer: Antalya
Kayıtlı: 09.12.2018
Mesajlar: 53

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

@deathisonitsway, çok teşekkürler hocam.
Bu kadar uzun ve detaylı cevap vermeniz beni hem mahcup etti (sizi zahmete soktuğum için) hemde sevindirdi.
İyi çalışmalar.

Çevrimdışı

#21 01.07.2019 14:38:14

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

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

Aslında senin sorunla ilgili temel ayrıntıyı yazmamışım bak unutmusum smile

senin kullanımın şu şekilde;

private $productRepository;

    public function __construct()
    {
        $this->productRepository = new ProductRepository();
    }

benim önerdiğim ise şu şekilde;

$this->app->bind(BlogRepositoryInterface::class,BlogRepository::class);

BlogRepositoryInterface.php

interface BlogRepositoryInterface 
{

    public function getPostsLastYear();

}

BlogRepository.php

class BlogRepository implements BlogRepositoryInterface
{

public function getPostsLastYear()
{

return Blog::lastYear()->get();

}

}

controllercü kullanımı şu şekilde;

protected $blogRepository;

public function __construct(BlogRepositoryInterface $blogRepository)
{

$this->blogRepository = $blogRepository;

}

senin kullanımınla arasında hemen hemen fark yok gibi değil mi ? görünürde öyle gibi duruyor.
Ama öyle değil işte..Ben providerdaki abstract olan interface i değiştirmiyorum..ama işi yapan sınıfı değiştirebilirim


$this->app->bind(BlogRepositoryInterface::class,BlogNewRepository::class);

gördüğün gibi concrete nesne değişti..ama problem yok..başka hiç bir şey yapmayacagım..
gidip controllercülerdeki nesneler aynı kalacak..değiştirmeme gerek yok..


Bunu sadece bu basic haliyle dusunmeyin.Mesela somut bir örnek olsun..


$this->app->bind(InternetServiceInterface::class,Tttnet::class);

evet internet hizmeti için ttneti kullanıyorum ve 50 yerde de kontrolcülerim internetserviceınterface nesnesini kullanıyor..problem yok..
ben superonline a cok rahat bir şekilde gecebilirim..

yapmam gereken şey..

$this->app->bind(InternetServiceInterface::class,SuperOnline::class);

bu kadar basit..arasındaki fark bu..

Son düzenleyen deathisonitsway (01.07.2019 14:39:35)


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

Çevrimdışı

#22 01.07.2019 18:14:17

coder2
Üye
Yer: Antalya
Kayıtlı: 09.12.2018
Mesajlar: 53

Yanıt: Yeni geliştirdiğim proje için geri dönüş verir misiniz ?

Dediğiniz gibi sonradan repository değiştirmek istersek provider içinde bind etmek daha kullanışlı oluyor. Bunu laracast ta görmüştüm, sizin yazınızdan sonra notlarıma baktım not ta almışım.
Fakat nedense pek üstünde durmadan kolay yola kaçıyordum. Standartlara uymam daha iyi olacak muhtemelen.

Tekrardan teşekkürler.

Çevrimdışı

Forum alt kısmı