• Как сделать ЧПУ пагинацию на Yii2?

    mulat
    @mulat
    seo, php, yii2
    Как раз только что с этим разобрался. Приведу пример кода из своего проекта.
    Вариант для yii\widgets\ListView
    Контроллер:
    $dataProvider = new ActiveDataProvider([
                'query' => Post::find()->andWhere(['category_id' => $model->id]),
                'pagination' => [
                    // Размер выводимых элементов на страницу. 
                    // Беру из настроек своего модуля blog
                    'pageSize' => Yii::$app->getModule('blog')->postPerPage,
                    // Размер эл-тов на страницу по умолчанию. Зачем нужен - поясню после кода
                    'defaultPageSize' => Yii::$app->getModule('blog')->postPerPage,
                    // Имя параметра, содержащего номер текущей страницы. 
                    // (если Ваш отличается от дефолтного 'page')
                    'pageParam' => 'pageNum',
                    // Так подавляется ссылка на первую страницу вида /category-name-х/1/
                    // Вместо неё выведется  /category-name-х/
                    'forcePageParam' => false,
                ]
            ]);


    Значение 'defaultPageSize' нужно установить равным значению 'pageSize' для того, чтобы подавить добавление классом Pagination параметра 'per-page' в урлы постранички. Но это нужно для того случая, когда не устраивает значение родного 'pageSize'. По-моему равно 20-ти.


    Так же требуется url первой страницы менять с такого mysite.ru/controllerName?page=1&per-page=2 на такой mysite.ru/controllerName

    Этот момент решается установкой параметра 'forcePageParam' в значение false.

    Для того, чтобы подхватывался route из Вашего urlManager, нужно чтобы описанный в менеджере pattern содержал правильные имена параметров. Т.е. в настройках класса Pagination - значение 'pageParam' по умолчанию задано как 'page'. Значит pattern для урлов должен быть такого плана:
    //...
    // Category with pager
     [
        'pattern' => '<alias:[\w\-]+>/<page:\d+>',
        'route' => 'blog/category/index',
        'suffix' => '/'
      ],
    //...


    В моём случае pattern для урлов такой:
    'pattern' => '<alias:[\w\-]+>/<pageNum:\d+>'

    P.S.
    В итоге мне самому этот вариант не подошёл, т.к. я хотел в постраничке оставить только ссылки на сами страницы без ссылок Следющий и Предыдщий пост. Не нашёл как сделать под ListView. А в LinkPager без проблем.
    Вариант для yii\widgets\LinkPager
    Контроллер:
    $query = Post::find()->andWhere(['category_id' => $model->id]);
            $countQuery = clone $query;
            $pages = new Pagination([
                'totalCount' => $countQuery->count(),
                'pageSize' => Yii::$app->getModule('blog')->postPerPage,
                'defaultPageSize' => Yii::$app->getModule('blog')->postPerPage,
                'pageParam' => 'pageNum',
                'forcePageParam' => false,
            ]);
            $postModels = $query->offset($pages->offset)->limit($pages->limit)->all();
    
            return $this->render('index', [
                'postModels' => $postModels,
                'pages' => $pages,
            ]);


    Представление:
    echo LinkPager::widget([
                'pagination' => $pages,
                // Отключаю ссылку "Следующий"
                'nextPageLabel' => false,
                // Отключаю ссылку "Предыдущий"
                'prevPageLabel' => false,
            ]);


    Вроде на оба вопроса ответил.

    P.S.

    Использую доработанный LinkPager. В частности ради настройки `activeLinkable` (не ссылаться на активную страницу), отображения номера конечной страницы и вывода островной нумерации:
    1,2,3,4 ... 44 [45] 46 ... 999
    Ответ написан
    1 комментарий
  • Как решаются задачи на вероятность?

    @SeptiM
    Посмотрите марковские цепи. На википедии английская статья вполне годная: https://en.wikipedia.org/wiki/Markov_chain

    Здесь, конечно, все проще. Но если бы города были соединены хитрее, и не из всех шли дороги к спасению, то решение было бы за цепями.
    Ответ написан
    Комментировать
  • Как решаются задачи на вероятность?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Конкретно для этой задачи алгоритм простой. На каждом шаге:
    Выигрыш (выход из леса) - одна дорога из трёх:
    W = 1/3
    Проигрыш (разбойники)- две дороги из трёх * вероятность встретить разбойников:
    L = 2p/3
    Остался в игре - две дороги из трёх * вероятность не встретить разбойников:
    G = 2(1-p)/3
    Соответственно, для i-го шага:
    Wi = 1/3*G(i-1)
    Li = 2p/3*G(i-1)
    Соотношение
    Wi/Li = (1/3)/(2p/3) = 1/(2p)
    не зависит от i, а значит для
    SUMi=1..N(Wi)/SUMi=0..N(Li) = 1/(2p)
    для любого N
    Таким образом, общая вероятность выигрыша
    PW = W/(W+L) = 1/(1+2p)

    Ну а читать - теорию вероятности и комбинаторику.
    Ответ написан
    Комментировать
  • Как решать задачу на счастливые билеты?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Как-то так:

    int S0[37],S1[37],S2[37],S3[37],S4[37];
    
    void Expand(int *a,int *b,int n){
    	int s0=0;
    	for(int i=0;i<n+10;i++){
    		if(i<n) s0+=a[i];
    		if(i>=10) s0-=a[i-10];
    		b[i]=s0;
    	}
    }
    
    int Conv(int *S,int balance,int m){
    	int res=0;
    	while(--m>=0) res+=S[m]*S4[balance+m];
    	return res;
    }
    
    // number of tickets in 0..u-1
    int NHappy(int u){
    	int res=0;
    	int balance=0;
    	int digit;
    
    	digit=u/10000000; u%=10000000;
    	for(int i=0;i<digit;i++) res+=Conv(S3,balance++,28);
    	digit=u/1000000; u%=1000000;
    	for(int i=0;i<digit;i++) res+=Conv(S2,balance++,19);
    	digit=u/100000; u%=100000;
    	for(int i=0;i<digit;i++) res+=Conv(S1,balance++,10);
    	digit=u/10000; u%=10000;
    	for(int i=0;i<digit;i++) res+=S4[balance++];
    	digit=u/1000; u%=1000;
    	for(int i=0;i<digit && balance>=0;i++) res+=S3[balance--];
    	digit=u/100; u%=100;
    	for(int i=0;i<digit && balance>=0;i++) res+=S2[balance--];
    	digit=u/10; u%=10;
    	for(int i=0;i<digit && balance>=0;i++) res+=S1[balance--];
    	if(balance>=0 && balance<u) res++;
    	return res;
    }
    
    void __cdecl main(){
    	S0[0]=1;
    	Expand(S0,S1,10);
    	Expand(S1,S2,19);
    	Expand(S2,S3,28);
    	Expand(S3,S4,37);
    
    	int m,n;
    	for(;;){
    		printf("m,n: ");
    		scanf("%d%d",&m,&n);
    		printf("Result: %d\n",NHappy(99999999)+1-NHappy(m)-NHappy(99999999-n));
    	}
    }

    Проверок входных данных не делается. На простых тестах результаты были правильными. Работает, по моим оценкам, быстрее, чем за 2000 операций. Если нужно проверять много диапазонов, то можно предварительно вычислить частичные суммы Conv() в циклах, и тогда любой диапазон сосчитается за два десятка операций (и при этом не будет требовать гигабайта памяти).

    UPD: Вот оптимизированный вариант:
    int S[8][38];
    
    void InitS(){
    	for(int i=1;i<38;i++) S[0][i]=1;
    	for(int a=1;a<9;a++){
    		int s0=0;
    		for(int i=1;i<=37;i++){
    			s0+=S[a-1][i];
    			if(i>10) s0-=S[a-1][i-10];
    			S[a][i]=s0;
    		}
    	}
    }
    
    // number of tickets in 0..u-1
    int NHappy(int u){
    	int res=0;
    	int balance=36;
    	for(int a=7,b=10000000;a>=0;a--,b/=10){
    		int digit=u/b;
    		u%=b;
    		int b1;
    		if(a>3){
    			balance-=9;
    			res+=S[a][b1=balance+digit]-S[a][balance];
    		} else{
    			b1=balance-digit; if(b1<0) b1=-1;
    			res+=S[a][balance+1]-S[a][b1+1];
    		}
    		balance=b1;
    	}
    	return res;
    }
    
    void __cdecl main(){
    	InitS();
    	int m,n;
    	for(;;){
    		printf("m,n: ");
    		scanf("%d%d",&m,&n);
    		printf("Result: %d\n",NHappy(99999999)+1-NHappy(m)-NHappy(99999999-n));
    	}
    }

    Не спрашивайте, почему :)
    Ответ написан
    3 комментария
  • Как решать задачу на счастливые билеты?

    butteff
    @butteff
    Раз в тысячу лет заправляю свитер в носки
    Вот решение на php, в C++ я не очень силен, но думаю разбить строку на элементы и преобразовать их в массивы Вы сможете. Также думаю, что мой код понятен, синтаксис у php не сильно отличается от сишного. В общем, Вы справитесь.

    <?php
    
    $lucky = 0;
    for ($i = 10000000; $i < 99999999; $i++) {
    	$str = (string) $i;
        $sum1 = (int) $str[0] + (int) $str[1] + (int) $str[2] + (int) $str[3];
        $sum2 = (int) $str[4] + (int) $str[5] + (int) $str[6] + (int) $str[7];
        if ($sum1 == $sum2) {
        	$lucky++;
        }
    }
    
    echo $lucky;


    UPD: код протестировал, этот, кажется, рабочий.
    Скобки перед переменными - это преобразование типов.
    Ответ написан
    6 комментариев
  • Какое перспективное направление в программировании для фриланса и иммиграции?

    afanasiy_nikitin
    @afanasiy_nikitin
    путешественник туда-сюда
    Во-первых, хотел бы порекомендовать книгу Чеда Фаулера "The Passionate Programmer: Creating a Remarkable Career in Software Development" (на русском: "Программист-фанатик", Питер, февраль 2015). Несмотря на свое название, она не столько о программировании, сколько о личностном росте, саморазвитии и прагматичном стремлении к совершенству, читать рекомендуется всем и каждому.
    Во-вторых, есть масса аналитических исследований в области IT, в последне время их особенно много из-за "кризиса", например ...о стагнации, образовании и востребованных профессиях.

    Если думаете об эмиграции (а выезд заграницу на ПМЖ это именно эмиграция), то тут есть 2 нюанса.
    Первый заключается в самой сложности переезда в другую страну с другими законами, налогами, климатом, языком, культурой, и тд, а тёплых мест хватает и в России (об этом миллион статей на том же Хабре).
    Второй - переезжать в другие страны имеет смысл в том случае, если вы собираетесь работать на окладе в офисе, например в крупной европейской/азиатской компании на высокой должности на территории работодателя. Фрилансеру же реальная польза от пеерезда весьма сомнительная (опять же, налоги в России - одни из самых низких).

    По поводу трендов и языков могу сказать следующее: если вы собираетесь жить и работать со стратегическим расчетом на карьерный рост, развитие и прибыльную должность в отдаленном будущем, то стоит задуматься о сложных, но актуальных технологиях, нацеленных в первую очередь на крупный бизнес (биржи, банковский сектор, системы аналитики и прогнозирования, ИИ, инетрнет вещей, etc.).

    Сейчас мир программирования равивается в двух основных полярных направлениях: низкоуровневое - ПЛИС и самодостаточные микроконтроллеры ("умная железка в каждую вещь"), и, противоположное ему - высокоуровневое проектирование и ФП. В первом случае много физики, во втором - матана, дискрета, теории категорий и всего такого.
    Лично мне ближе второй вариант, поэтому я для себя выбрал технологии, основанные на Java (почему именно Java - пояснил ниже в комментарии): Scala, Lift, ФП, функционально-ориентированное проектирование, мета-программирование, DSL, вот это всё.

    По поводу "готовых решений" лично я наблюдаю обратный процесс: люди стараются отказываться от универсальных готовых решений в пользу гибких, компактных и заточенных под конкретную бизнес-логику (опять же DSL и DDD).
    Но начать всё же рекомендую с Фаулера. Затем Р. Мартин "Clean coder" (на русском "Идеальный программист. Как стать профессионалом разработки ПО"), само собой МакКонелл, Крэг Ларман, и прочие бестселлеры.
    Да, и не забудьте книгу Грега МакКоена "Эссенциализм...", очень полезная вещь в наше время. Личностный рост и саморазвитие сейчас не менее важно (а иногда и важнее) просто "программирования".
    Ответ написан
    8 комментариев
  • Как составить алгоритм решения задачи на ДП или Рекурсию (Задача на лесенку)?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Решить задачу легко - заводите массив A[N,N], в каждой клетке [K,M] которого будет записано число лесенок из K кубиков, нижний слой которых состоит из M кубиков. Число будет ненулевым, когда M <= K <= M*(M+1)/2.
    Массив заполняется начиная со строчки K=1 по формуле A[K,M]=sum(A[K-M,r],r=1..M-1). Сумма элементов в строчке K=N будет искомым числом.

    В решении, ссылку на которое вы дали, последовательно вычисляется число лестниц из j кубиков, нижний ряд которых не длиннее, чем i кубиков. Чтобы найти это число, надо к уже найденным лестницам, нижний ряд которых не длиннее, чем i-1 кубик (их мы оставляем без изменения), прибавить лестницы из j-i кубиков с нижним рядом не длиннее, чем i-1 кубик (к ним мы добавим ряд из i кубиков). Что и делается во внутреннем цикле.
    Ответ написан
    5 комментариев
  • Как запустить проект, если нет больших финансов?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    поднимаете новый сервер, настраиваете реплекацию баз данных (что бы база на старом и на новом сервере были синхронизированы), затем переводите DNS на новый сервер и когда они все обновятся тушите старый.

    А еще можно вместо ноды за 160 в месяц попробовать добавить еще одну-две за 10$, настроить репликацию опять же, и поставить еще одну ноду на фронт для проксирования запросов через nginx.

    А еще можно вынести базу данных на сервер помощнее и оставить пару серверов для приложения...

    Все очень сильно зависит от того, в чем у вас узкие места. Если места физически не хватает изза большого количества статики - можно вынести статику на отдельный сервер. Если база растет - можно базу вынести. Ну вы поняли.
    Ответ написан
    3 комментария
  • Можно ли участвовать в разработке проекта как зритель? Просто для получения опыта и навыков?

    shqn
    @shqn
    Будучи зрителем, вы не получите того опыта и навыков, о которых говорите. Только практика принесет плоды. По-моему, идеальный вариант, это сделать все, чтобы попасть в более-менее серьезную компанию Junior-разработчиком. Компанию, в которой сложились хорошие практики программирования, налажены процессы производства и взаимодействия людей внутри команды.

    В этом есть плюсы для вас:
    — Само собой, опыт;
    — Знание о хороших практиках и паттернах;
    — Наличие опытных людей вокруг.

    В этом есть плюсы для работодателя:
    — Вряд ли вы будете просить высокую ЗП на начальных этапах;
    — Если вы пришли в компанию не как на перевалочный пункт, то для работодателя вы инвестиция. То есть взращенный сотрудник, которого не нужно отучать от плохих практик, с которым можно работать и который находится в контексте проекта;
    —Очень быстро вы сможете освободить других разработчиков от каких-то рутинных задач, который делать надо, но делать никому не хочется.

    Но есть некоторые тонкости. Чтобы обучение в такой команде проходило максимально быстро, не стоит просто отсиживаться и ждать конца рабочего дня. Придется тормошить опытных разработчиков постоянно, спрашивать, просить code-review. Каждый день стараться делать что-то новое, стараясь также избегать рутины. Приходить домой и снова писать код, читать статьи, пробовать и т.д.
    Ответ написан
    3 комментария
  • Где скачать хороший учебник по математике?

    globuzer
    @globuzer
    gezgrouvingus progreszive ombusgrander greyderzux
    Начиная с 5-ого класса, самый лучший и классический учебник для монстров математики, это любой сборник задач под редакцией Сканави. Есть с решениями, есть без. Есть просто задачи, есть задачи для поступающих в ВУЗы, есть олимпиадные задачи, есть голимая теория.
    Все книги этого автора являются неоспоримым подготовительным уровнем по математике школьника, кто как-то видит себя в будущем, связанным с математическими науками.
    А нынче жизнь такова, что все перспективные технологии, профессии, науки, все что пользуется спросом, - было, есть и будет связано с математикой. Сканави - маст хэв!

    Дополнено:
    Может быть они слишком сложны для современной программы? Сейчас в школах на курсах углубленного изучения математики не дают того объема, что давали раньше и на обычных курсах школы. Все это спорно. Школы разные, требования разные.
    Но математика остается математикой, в сборниках Сканави (еще советских изданий) как раз содержится базовый и монолитный фундамент достаточно СИЛЬНОЙ математической подготовки.
    Еще к ответу: читайте журналы КВАНТ, что выпускались в СССР, справочник Бронштейн, Семендяев, Корн. Сборники Данко и Кожевникова - инетересны будут для школьников старших классов и студентов первых курсов.
    На самом деле - в последнее время встречал столько современных сборников и учебников, а по базе знаний они уступают с теми, что были в СССР.
    Учите и любите математику в любых ее проявлениях, временах, учебниках.
    Тех знаний что вам не хватает, просто гуглите и ищите в других книгах и ресурсах интернета, в том числе и зарубежные сайты.
    Ответ написан
    5 комментариев
  • Как быстро скопировать 40 млн файлов на другой сервер?

    gbg
    @gbg Куратор тега Linux
    Любые ответы на любые вопросы
    Как-то так:
    dd if=/dev/sda bs=65536 | ssh target-ip 'dd of=/dev/sda bs=65536'.

    На агрегированном канале 2x1Gbit выдает 100 мегабайт в секунду. Если подшаманить размеры блока bs= и mtu, и еще шифрование у ssh выключить, можно, я думаю, и все 200 мегабайт выжать.

    Проводить, на отмонтированном! (или смонтированном в readOnly) диске!
    Не зря dd расшифровывается как DestroyData.
    Варианты настройки шифрования (-c) и скорость (лучше - больше):
    ssh-cipher-speed-chart.png?w=630
    Ответ написан
    8 комментариев
  • Стоит ли изучать JavaScipt и C# одновременно с нуля?

    morozovdenis
    @morozovdenis
    Конечно нет. Эволюционно мозг человека сложился так что С++ и С# можно одновременно изучать, но JS и C# нет. Когда вы будете изучать JS вы будете тут же забывать C# полностью и наоборот. Вот C++ хороший, он сочетается с C#.
    Ответ написан
    1 комментарий
  • Чем отличается junior от middle? а Senior?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Вот как это выглядит с т.з. работодателя

    Джун
    - собеседование
    изъясняется исключительно на сленге (большую часть которого не может внятно объяснить), готов в одиночку за неделю написать новую ОС, или две - за полторы, если только для этого не придется учить ассемблер, несмотря на юный возраст уже обладатель прав на обе версии и один бэкап личного сайта с фотографией кошки в розовой рамке и знает, что синглтон - это абсолютное зло, хотя и не может написать его без ошибок.
    - испытательный срок
    долго мудохается с настройками рабочего места, которые регулярно слетают под тяжестью многотысячных плагинов, шелов и скринсейверов, донимает админов, находит две (орфографические) ошибки в документации проекта и один быстрый альтернативный способ сделать форк из SVN, после которого проект, к сожалению, не билдится не только у него, но и у всей команды. Берется все немедленно исправить с помощью другого чудотворного плагина, (неожиданный баг в котором приходится фиксить двум миддлам), после чего насильственно лишается рута, плагинов и шелов и начинает изучать проект под чутким контролем матерящихся миддлов.
    - работа
    научился билдить проект, писать тесты и коммитить, не роняя этим билд, понял смысл многих сленговых выражений, подружился с миддлами и админами, не путается в названиях ключевых технологий, радикально сократил число плагинов, удалил сайт с кошкой, работает.

    Миддл
    - собеседование
    не глубоко, но уверенно знает ключевые технологии, разницу между абстрактным классом и интерфейсом и три-четыре вежливых ответа на вопрос, "сколько это может занять времени".
    - испытательный срок
    влился в проект и работает.
    - работа
    работает стабильно и продуктивно.

    Синьор
    - собеседование
    указывает на ошибку в тестовом задании, предлагает два решения проблемы, над которой команда пыхтела последнюю неделю и альтернативный стек технологий, на который можно перевести проект
    - испытательный срок
    рефакторит проект, делает билд джун-устойчивым, по ходу дела пишет алгоритм для киллер-фичи, запланированной только на следующий квартал и под конец испытательного срока организует воркшоп, на котором представляет свои наработки "в свободное время" по переводу проекта на другой стек технологий, в которых уже реализована большая часть функционала следующего релиза.
    - работа
    пинками помогает команде в переходе на одобренный руководством новый стек, в чем его активно поддерживает джун, окрыленный тем, что теперь его накопившиеся косяки точно никто не заметит, переводит проект на новый стек, увеличивает производительность в два раза, через год переводит еще раз, периодически генерирует идеи новых продуктов, может пропасть на неделю и вернуться с новой фичей, а может уйти в накопившийся за несколько лет отпуск и больше не вернуться, т.к. случайно встретил старого знакомого, передложившего другой мега-проект с гига-зарплатой.
    Ответ написан
    4 комментария
  • Как передать в возвратную (callback) функцию jquery параметр - DOM элемент?

    RubaXa
    @RubaXa
    Так и передайте:
    $('.update').click(function(){
       var id = 12345,
             $el = $(this);
    
       $.post('http://localhost/?UPDATE=true', { id: id }, function(data){
    	if (data == 'tr') {
               $el.fadeOut();
           }
       });
    });
    Ответ написан
    1 комментарий
  • (Yii2) Какой лучший способ работы с аватарами пользователей?

    SamDark
    @SamDark
    Yii2 core team
    1) Желательно.
    2) В отдельном классе.
    3) Можно по-разному сделать. Я бы для удобства сделал как-то так:

    class AvatarManager
    {
    }
    
    class User
    {
        private $avatarManager;
    
        protected function getAvatarManager()
        {
            // здесь можно устроить и честный dependency injection, если планируется писать
            // честные модульные тесты или есть подозрения, что менеджеров будет не один
            return $this->avatarManager === null ? new AvatarManager($this) : $this->avatarManager;
        }
    
        public function getAvatarUrl($width, $height)
        {
             return $this->getAvatarManager()->getUrl($width, $height);
        }
    }
    Ответ написан
    9 комментариев
  • Вопросы по оборудованию?

    google.com, цена: Бесплатно.

    У вас комплексный запрос, в котором не получиться купить коробочку, нажать кнопочку и все заработает.

    Вам нужна система телефонии на основе АТС (лучше взять ИП телефонию на Астериске), для приема звонков от мобильных вам нужен GSM шлюз.
    Ответ написан
    3 комментария
  • Что понимать под словом back-end?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Если очень примитивно, то пользователь работает с frontend, который собирает и отправляет данные backend-у, который, в свою очередь, делает что-то с этими данными. В контексте клиент-серверного ПО, то клиент это frontend, а сервер - backend. Между ними http (обычно restfull или soap интерфейс, которые служат транспортном для данных).

    В более общем смысле, front-end является интерфейсом, который подготавливает данные для передачи на нижестоящий уровень (back-end). Причем уровней может быть сколь угодно много, так что на сервере так же может быть свой front-end и back-end к нему.
    Ответ написан
    Комментировать
  • Чем заслужил свою популярность Laravel?

    ajaxtelamonid
    @ajaxtelamonid
    Laravel
    Тем, что там можно писать мало там, где мы привыкли писать много. Подобный "конвеншн овер конфигурейшн" - он помимо прочего оставляет ощущение, что автор пишет не сферическую вещь в вакууме, которая якобы должна подойти всем, а для нас, для простых рабочих пацанов с окраин, со своими вполне конкретными юзкейсами. Т.е. он 1. человек умный и 2. знает жизнь. Это подкупает.

    Например, в output идет то, что возвращено из контроллера, а если возвратить ORM-объект или массив (точнее коллекцию) ORM-объектов, то будет отдан json, причем со всеми связанными объектами. Масса нужных в хозяйстве вещей, которые идут из коробки (миграции, редис, кэш с множеством провайдеров, работа с очередями, консольная тулза artisan для разнообразных обслуживающих вещей). Изкоробочная работающая сборка вьюх в лейаут, минимум возни с авторизацией. Скоупы в ORM. Кусочки конфигов в файлах, которые удобно ставить в .gitignore. В общем, масса такого вот, мелкого, но очень удобного.

    На Laravel ОДНОВРЕМЕННО можно уйти в глубины аццкого хадкора по Фаулеру, с тестированием всего и вся, с интерфейсами, депенденси инжекшнами, репозиториями, обсерверами, ентитями, гексагональными сценариями итд, итп, _подставить_любимый_паттерн_, И в то же время забить на это всё, сгенерить _ide_helper для подсказок по "фасадам" в IDE и фигачить код со статическими вызовами, как будто весь фреймворк написан на статике, как Кохана. Т.е. и сайт-знакомому-за-вечер и огроменный кровавый энтерпрайз делаются на одном фреймворке - в зависимости от того, насколько глубоко исполнитель хочет погружаться в свой продукт. Подобная гибкость - это, имхо, очень круто.

    И еще - как показала практика фреймворкостроительства, или ты двигаешься вместе с развитием php, либо ты делаешь "более лучшее, удобное и грамотное" решение и тихо загниваешь с своем междусобойчике за пару лет. Laravel двигается максимально близко к php - следование psr, composer-платформа в качестве базы, фрейморк ставится оттуда и пакеты расширения тоже имеют composer-формат. Что говорит о том, что у фреймворка есть все шансы прожить долгую и счастливую жизнь.
    Ответ написан
    Комментировать
  • Как отсортировать массив по цене и убрать одинаковые элементы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $temp = array();
    foreach ($rr_wordz as $row) {
        if (!isset($temp[$row['word']]) || $temp[$row['word']] < $row['max_bid'])
            $temp[$row['word']] = $row['max_bid'];
    }
    $result = array();
    foreach ($temp as $key => $val)
        $result[] = array('word' => $key, 'max_bid' => $val);
    Ответ написан
    Комментировать