PHP çerçeve URL sözleşmeler

5 Cevap php

Çerçeveler bir sürü /controller/action/{id} büyük olduğu gibi URL kurallarını kullanabilirsiniz, ama bunun ötesinde herhangi bir yapılandırma gerekiyorsa, kendi rotaları yazmak size kalmış.

Nasıl backend /users/{id}/friends gibi URL'leri işlemek? (Bir kullanıcının tüm arkadaşlarına listelemek için)

Ben denetleyicisi, böyle bir şey uygun olacağını düşünüyorum:

class User {
    function index() {
        echo 'user index';
    }
}

class Friend extends User {
    function index($user_id) {
        echo 'friend index';
    }    
}

Sonra aşağıdaki haritayı olurdu:

/users              -> User::index()
/users/{id}         -> User::view($id)
/users/{id}/friends -> Friend::index($user_id)

Ben kullanıcı sınıfı içinde Arkadaşa sınıf koymak istedim ama görünüşe PHP ben bu ile gelebilir iyi olduğunu yapamaz. Düşünceler?

Ne URL arkadaş listenizi düzenlemek için kullanmak istiyorsunuz? /users/{id}/friends/edit işe yarayabilir, ancak başkasının Arkadaş listesini düzenleme asla beri, uygun görünmüyor. /account/friends/edit daha iyi bir seçim olurdu? Bunu nerede için gelen kodu koymak istiyorsunuz? Bir arkadaşı denetleyici veya bir kullanıcı denetleyicisi veya özel hesap denetleyicisi?

Bonus soru: tercih edersiniz? /photos/delete/{id} veya /photos/{id}/delete


The answers:

Peki, ne cevaplar elde ettik "şey" ("arkadaşlar" gibi) karmaşık ama kendi denetleyicisi yoksa, bir model olmadan ona bir verebilir, ya da değilse, ki sen olduğunu en çok yakından ilgili oluyor ne olursa olsun o şeyler de. Eğer kodu koymak nerede URL'ler etkilememelidir. Çoğu insan insanın aşina ne, çünkü /controller/action/{id} whever mümkün ayrılmamak gerektiğini düşünüyor.

Gerçekten "garip" olduğunu söyleyerek kenara genişletilmiş sınıf yorumladı kimse yok. Ben gerçekten bunu ayırmak istiyorsa belki Friendlist bu durumda daha uygun bir sınıf olurdu.

Tüm cevaplar için teşekkürler :)

5 Cevap

Bahsettiğin ve bu yapıyı elde etmek için alt sınıfları kullanılarak konum yolu, benim için biraz garip görünüyor yolları. /controller/action/{id} standart kongre basit eylemler için çok çalışır, ama karmaşık bir uygulama oluştururken, eğer her zaman özel yolları oluşturmak gerekir. Orada bu yolları oluştururken kullanmak için bazı iyi kurallar muhtemelen, ama gerçekten uygulamanız tutarlı kalan ve mümkün olduğunca basit şeyleri tutmak için aşağı kaynar.

Ben bir "Friend" denetleyiciye /user/{id}/friends eşleme için herhangi bir iyi bir neden görmüyorum. Neden sadece "friends" User denetleyici bir eylem olmak zorunda değildir? Aslında belirli bir arkadaşınızın sayfasını görüntülemek için detaya sonra, bir Friend denetleyicisi (/friends/view/123) kullanabilirsiniz ya çalışır, böylece sizin User denetleyicisi başka amaçlarla olabilir Bir arkadaşınıza veya şu anda oturum açan kullanıcı için (/user/view/123).

Re: Bu en yaygın kabul gören mekanizma olduğu gibi Bonus soru, ben /photos/delete/{id} (/controller/action/{id}) ile sopa istiyorum.

Ben tercih ederim /photos/{id}/delete. Benim akıl bir URL'nin sonunda kapalı bir bileşeni alırsak, yine de mantıklı gerektiğidir.

Bu /photos/{id} ne yapması gerektiğini varsaymak oldukça kolaydır: bunun için fotoğraf kümesini görüntülemek {id}.

Ama /photos/delete ne yapmalıyım? Bu gerçekten belirsiz.

I /controller/action/id varsayılan sözleşmenin tür var olduğunu biliyorum, ama bu organizasyon denetleyicileri sınıf / yöntem mimariye haritalama uğruna olduğunu. Ben (URL UI bir yol parçası olan) kod yerleştirmek için UI düzenlemek için iyi bir fikir olduğunu sanmıyorum.


Yorumların Re: Evet, /photos/{id} belki onun kimliği tarafından verilen bir fotoğrafı görüntülemek için daha mantıklı. /users/{id}/photos belki de bir koleksiyonu görmek için. Bu size kalmış.

Nokta değil kod organizasyon açısından, kullanıcıları açısından UI düşünmek gerektiğidir.

Ayrıca veri depolama nasıl bağlıdır. Bazı durumlarda size modelinde bir varlık olmak için bir 'dost-list' ihtiyaç düşünebiliriz. Mantıklı bir yaklaşım daha sonra her arkadaş listesi, birincil anahtar için benzersiz bir tanımlayıcı belirtmek olacaktır.

Sadece bunu düzenlemek ya da silmek için arkadaş-listenin bir birincil anahtar ihtiyaç olarak bu mantıksal, aşağıdaki rota neden olur ...

/friends/edit/{friendListId}

Bu karar size kalmış. Pix0r belirtildiği gibi: küçük uygulamalar için kuralıdır /{controller}/{action}/{id} {id} web sitelerinin eylemlerin çoğu ile maç için isteğe bağlı olması gereken yerde. Bazı durumlarda uygulamalar büyük olsun ve fazla 3 unsurları ile belirli yolları tanımlamak istiyorum. Bazı durumlarda bazı kişiler hemen (örneğin yukarıda) büyük bir anlamı olsun ve (... tekrar varsayılan rota mükemmel yapar) bunun için özel bir denetleyici tanımlamak için karar verebilir.

Ben varsayılan yol /controller/action/id ile sopa ama sadece başında (arkadaş gibi) her şey için denetleyicileri yapmaya başlamak gerekmez. Model-View-Controller desen çok kolay change routes later on, sürece tüm yol bağlantıları ve eylemleri (formları vb) oluşturulur gibi yolları ve eylemlere dayalı etmek için yapar. Yani gerçekten bu kadar rahatsız gerekmez :)

Ya yapın ya da olabilir. Sorun iki karışımı durumdur. Birisi "arkadaşlar" id sahip olduğunda / users / {id} / arkadaşlar ve / users / arkadaş / {id}, bu başarısız olur. Bu önemsiz bir durum gibi görünebilir ama kimlikleri için kullanıcı adlarını kullanmak çok popüler. Sen her eylem için kullanıcı adlarını sınırlamak zorunda olacak.


Bazen yapamaz /{controller}/{action}/{id}

Ben bir süre önce bir indie müzik sitesi yaptım ve yaptığımız

/artist/{username}
/artist/{username}/albums
/artist/{username}/albums/{album}

Biz yapmadık koşullar için test etmek istiyorum bu yüzden vermedi

/artist/{username}/{album}

Biz "albümleri" adında bir albüm olan herkes kontrol etmek istemiyordu çünkü

Biz bunu yapmış olabilir

/artist/{username}
/artist/{username}/albums
/albums/{album}

ama sonra URL sanatçı adı ve albüm adı ikisine birden sahip olan SEO avantajını kaybedecek. Ayrıca, bu durumda biz sanatçıyı sanatçı olarak aynı albüm isimleri olması için ortak beri kötü olacağını benzersiz olacak şekilde albüm isimleri zorluyor olacaktır.

Sen saf /{controller}/{action}/{id} yapabilirdi ama o zaman bazı SEO kaybeder ve URL kısalma yapamaz.

/artist/view/{username}
/artist/albums/{username}
/album/view/{album}


Geri örnek alınıyor.

/users/{id}/friends/edit could work, but it doesn't seem appropriate, since you should never be editing someone else's friend list.

Kullanıcı kimliği nasılsa bir oturumda sizin varsayarak yinelenen bilgiler olduğundan bu durumda /friends/edit olmalıdır. Genel olarak URL kısaltma değil URL büyümesini desteklemek istiyorum.

(Bonus question) Neither, i'd use REST. DELETE /photo?id={id}

URL'ler kendilerini gerçekten çok fazla önemli değil. Daha da önemli olan kontrolörler her gider budur. Sizin örnekte arkadaşınızın liste User sınıfını genişletmek vardı. Arkadaş listenizi gerçekten kullanıcıların sadece bir listesi Eğer bir yerde kullanıcıların listeleri ile anlaşma, böylece belki Users denetleyicisi uzanmalıdır.

class Users {

    public function index() {
        $users = $this->findUsers();
    }

    protected function findUsers($userId=null) { ... }
}

class Friends extends Users {

    public function index($userId) {
        $users = $this->findUsers($userId);
    }
}

Eğer zor bir zaman sınıfların her ne gerek yazma dışarı uzatmak ve uzun liste ile birini seçmek için hangi sınıf sergiyi varsa.