ОФФ: 1ч. пиша поста и накрая защо ли да не натисна CTRL + R, че да си рефрешна страницата.
Този път по-накратко ще го дам. Аман от тъпи ситуации вече. Да сложиш рефреш на CTRL+R, акъли.
_________________________________________
Има безброй начини да направиш нещо, но въпроса е да го направиш по по-добър начин. Не търси винаги лесния начин, а търси начина, който покрива всякакви непредвидени ситуации.
Идеята на MVC е да се структурират нещата по най-добрия начин. Да е четимо и лесно откриваемо за всички, които ще работят с този код.
Плюс това въобще не е практично да изпраскаш един голям масив в метод на клас.
Най-добре си отделяй файловете отделно и си ги зареждай там, където ти трябват.
Така да продължа нататък. Първо не разбрах изобщо какви са тия алиаси за които говориш. Този ClearFlag и TempData също не ми е ясно за какво ги ползваш.
1. Alias - екстрактора съм го направил да можеш да зареждаш няколко файла на веднъж, защото ако решиш да си категоризираш файловете, това ще е от голяма полза. Понеже при зареждане, всичко влиза в един масив
TempData, то ни трябва да разграничаваме двата файла, защото ако извикаме някой индекс, който присъства и в двата файла, ще стане фал. Поради тази причина съм направил така, че да можеш да си именуваш файловете(масивите).
Пример:
Да речем, че зареждаме два файла, единия е array1.php, другия array2.php. Това всичко влиза в
TempData, но ние не искаме това. Като викам някой индекс, искам да знам от кой файл го викам. За това задаваме име. Да речем, че първия файл ще е а1, а втория а2. В случая в
TempData се получава следното:
PHP:
$tempData = array(
'a1' => array(), // масива от първия файл
'a2' => array() // масива от втория файл
);
По този начин вече знам къде ми е масива от първия файл и къде от втория.
Когато съм задал имена, то после на екстрактора мога да му задам кои индекси от кой масив искам да изкарам.
Пример 2
PHP:
class Test {
// тука да речем, че сме заредили файловете в конструктора
public function page1_title() {
$this->aeExtract(['title' => 'page1.title'], 'a1');
}
public function page2_title() {
$this->aeExtract(['title' => 'page2.title'], 'a2');
}
}
След това спокойно мога да си викам title, без да се притеснявам, че ще извикам грешния. Просто на aeGet() , ще задам от кой файл искам да взема title.
PHP:
$this->aeGet('title', 'a1'); // това ще ми върне page1.title, който се намира в първия файл
$this->aeGet('title', 'a2'); // това ще ми върне page2.title, който се намира във втория файл
Когато екстрактваш, не е нужно да задаваш име на индекса, но съм го сложил като улеснение, защото ако не зададеш име, ще стане по този начин
PHP:
$this->aeGet(0, 'a1');
// ... тука същото, но с a2
В момента се сетих и за по-добър вариант на направа, но както казах, това е набързо написан екстрактор, за примера, и не съм влагал много-много мисъл, за да е нещо читаво.
Когато извикваш само един файл, не е нужно да задаваш alias име. Тогава просто не подаваш втория параметър и файла си се вкарва във временния масив и после си използваш останалите функции без да посочваш от кой файл искаш да извикаш(защото така или иначе е само един).
Надявам се да схвана идеята на alias имената.
2. TempData - използвам временен масив понеже той винаги се пълни с всички индекси. Но аз, например, не искам винаги да извиквам индекси от целия масив. Поради тази причина, когато екстрактвам взимам само нужните ми индекси и ги вкарвам в основния масив, от който след това извличам информацията. Това съм го направил с цел по-бързо търсене в масива. Защото, ако имам масив с 200 индекса, а аз искам в случая само 2, то ще е по-бързо да индексираш при 2 записа, отколкото при 200
3. ClearFlag - това съм го сложил поради следната причина. Този флаг служи, за да мога да определям дали ще екстрактвам на няколко места. Ако е включен, то екстракта ще ми работи само веднъж, след това временния масив ще се изтрие и няма да имам данните.
При горния случай примерно, ако имам включен флаг, то ще ми даде грешка при втория екстракт, понеже няма да може да намери
TempData. Тогава се случва следното. Първия екстракт си казва "Добре, взех това, което искаше, сега ще изтрия временния масив, защото повече няма да ти трябва". И това е супер. Няма нужда да държим нещо, което няма да ни трябва.
Е, да, но ако искаме да направим по-надолу друг екстракт, то няма да можем, защото същата функция ще каже "Чакай сега, ти взе това, което искаше, не можеш да взимаш повече, защото нямам данните" и ще изпраска грешка.
Когато смяташ, че в един клас ще имаш няколко екстракта, то още в началото задай този флаг като изключен, за да не може да се изтрие временния масив и да можем да го ползваме и след това.
Не ми харесва че трябва да се инклудват файловете, и да им се задава път до папка и име на файла всеки път. Това според мен е работа на аутолоадинга.
Това не е точно така. Не е работа на autoloader-a. Работата на autolaoder-a е, да ти предостави нужния клас, точно там, където ти трябва. Но тука говорим за масиви. Ако имаш няколко файла(обърни внимание, че аз гледам да отразявам различни ситуации), то как ще разбере autoloader-a кой да ти зареди ? Ще трябва да описваш за всеки клас точно кои файлове искаш да се заредят.
Точно поради тази причина съм направил manual loading. В нужния клас, ако трябва и в нужния метод си викаш точно този файл, който ще използваш. Ако ти се наложи да ползваш различни файлове, ще си ги заредиш тези, които ти трябват.
Така или иначе ти работиш с шаблон. Когато пишеш един контролер, ти ще знаеш точно какво ще ти трябва да извлечеш.
По този начин имаш опцията за всеки метод да заредиш различен файл, но имай предвид, че ще трябва да задаваш alias names.
Друго което не ми харесва е синтаксиса по-който са написани масивите и по-точно квадратните скоби. Сигурно има смисъл да ги пишеш така, но на мен не ми харесва.
Това си е личен избор. На мен ми е по-готино да използвам квадратните скоби, понеже в последно време пиша само на JavaScript, а там основния им синтаксис е този. Но ти щом искаш да си използваш стандартния начин за PHP, използвай го. Същата работа е.
Още един път ще кажа, целта е максимално просто да се вземат стойностите от разни масиви, като това не нарушава MVC. Предпочитам масивите да са в клас а не в прости php файлове ако е възможно.
Пак ще кажа. Не търси винаги максимално опростеното. Направи така, че да покриваш различни непредвидени ситуации. И това, което ти замисляш напълно нарушава MVC. Модела не съдържа данните, той прави така, че да си ги набави, за да ги даде на контролера.
Много грешно е да се слагат такива големи масиви в класове. Дори големите frameworks си слагат конфигурационните данни в масиви в различни файлове. За пример можеш да вземеш Laravel. Представи си техните файлове, които покриват всякакви аспекти(app, database, cache, broadcasting, filesystems, mail, session, view, services и т.н.) да са ти в един клас, само и само да е по-удобно за ползване. Еми, аз ако видя или работя с такъв вид структура, то или ще псувам създателя на това нещо или ще се принудя да го преправя, а никой не иска да си губи времето с нещо, което негов колега е трябвало да направи предварително.
Този екстрактор можеш дори да го ползваш за Локализирането на сайта(Multilingual), като си викаш езиковите файлове и си ги екстрактваш така, както си искаш.
Относно Трейтовете, аз бих си останал на този вариант. Трейтовете се ползват, когато имаш голямо повтаряне на код и голям използване. В случая, ако го ползваш постоянно, във всеки контролер, да речем - трейтовете според мен са идеална алтернатива.
П.П. Надявам се, че не съм изтървал да кажа нещо и че този път съм описал нещата по-ясно.
