• Чем WebSocket в php отличается от того же в js?

    iMukcep
    @iMukcep
    Вопрос задан крайне некорректно. WebSocket - это протокол передачи данных, который работает поверх TCP. Есть WS-клиент, и есть WS-сервер, к которому подключаются клиенты.

    Далее, по теме вопроса: Клиент можно написать на чём угодно, хоть на php (при большом желании), хоть на js (на js на это уходит пару строк кода). Так что можно сказать одно - отличие разве что в реализации, ну и осмысленностью действий, ибо никогда не сталкивался с необходимостью писать клиент на PHP.

    И да, на последок: писать WS-сервер на php - заведомо гиблое дело, сам с этим сталкивался. Пришлось в итоге искать альтернативы в виде Python'a и NoneJS.

    Поправьте, если где ошибся.

    UPD:
    Ссылки:
    https://ru.wikipedia.org/wiki/WebSocket
    https://learn.javascript.ru/websockets
    https://habrahabr.ru/post/209864/
    https://github.com/varspool/Wrench
    Ответ написан
  • Как связать Vue.js с php?

    nexmean
    @nexmean
    погромист
    >Или лучше связать front с backend через ajax запросы к api?
    This.
    Ответ написан
    Комментировать
  • Какие есть обучающие материалы по React на русском?

    @DragorWW
    Front-end Developer
    Вообще есть не плохая статья (перевод) на хабре, по react, redux
    Ответ написан
    Комментировать
  • Какие есть обучающие материалы по React на русском?

    theWaR_13
    @theWaR_13
    Не на русском, конечно, но все равно. Только что вышла книга, в настоящий момент дописывается. Я себе купил, выглядит очень достойно.

    https://www.fullstackreact.com/
    Ответ написан
    Комментировать
  • Какие есть обучающие материалы по React на русском?

    SPAHI4
    @SPAHI4
    реактовцы - это не девы, а прокидыватели пропсов
    Ответ написан
    Комментировать
  • Какие есть обучающие материалы по React на русском?

    @Alex493049469
    Ответ написан
    Комментировать
  • Стоит ли и зачем использовать PHP на фронте, где есть Angular?

    max_bozhenov
    @max_bozhenov
    Top-notch frontend developer & ui designer
    Я сам по себе Full-stack разработчик, но больше Frontend'ом люблю заниматься... Начинал работать с AngularJS (набрался опыта с 1-й версией и после релиза второй версии - забил на AngularJS), сделал пару SPA проектов на AngularJS и скажу следующее, AngularJS - только для SPA приложений, а PHP только в качестве RESTful API сервиса (в мое случае, я использую Laravel/Lumen и считаю это идеальное решение!)

    Если же хотите и дальше на этом проекте работать, возьмитесь за VueJS2 (лично мое имхо, он куда более приятнее чем AngularJS2, а у первой версии нет будущего и нет смысла новые проекты начинать делать на нем...). И он хорошо подходит для SSR приложений, т.е. не обязательно делать SPA. Я как раз сейчас и разрабатываю бизнес приложение на этом стэке (VueJS2 + Laravel).

    Хотя... если я правильно понял и вы делаете игру в команде, то для игры в наше время SPA самый лучший выбор. Так что предложите в команде перейти на RESTful API сервис в качестве бэкэгда...
    Ответ написан
    1 комментарий
  • Где используются прототипы, наследование в JS приложениях?

    yurakostin
    @yurakostin
    Front-end developer
    Здравствуйте.
    На самом деле всё проще.
    Не обижайтесь, но вы просто не так хорошо знаете сам javascript.

    1. prototype - ссылка на прототип объекта.
    Array.prototype, Number.prototype. В нём хранятся методы и свойства этого объекта, а также... (далее переходим к __proto__)

    2. __proto__ - тоже ссылка на прототип. Например, введите в консоли [] и раскройте ветвь. У вас всего два свойства. Одно - length - количество элементов в массиве. Другое - __proto__. А где же все методы, которые мы можем использовать с массивами filter, map, slice и так далее? Они лежат в __proto__. Более подробно здесь.

    3. inheritance соответственно - наследование. JS построен на прототипной парадигме (надеюсь, я тут не наврал). Array наследуется от Object. Это можно легко увидеть, посмотрев Array.prototype. Там вы увидите тот самый __proto__, являющийся ссылкой на Object.prototype. Вся инфа по ссылке выше.

    4, 5. call и apply постепенно уходят из обихода, но тем не менее про них важно знать и уметь ими пользоваться. Эти методы позволяют вызвать функцию в контексте, который вам необходим.

    Например вам нужно вызвать метод какого-то объекта, который работает с this в контексте другого объекта, у которого этого метода нет. Вы можете сделать следующее:
    var o_1 = {
    	name: 'Peter',
    	hello: function () {
    		console.log('Hello, ' + this.name);
    	}
    };
    
    var o_2 = {
    	name: 'Jane'
    };
    
    o_1.hello.call(o_2); // Фактически вы говорите "вызови метод такой-то для объекта такого-то"


    Для передачи аргументов в "заимствованную" функцию оба метода принимают аргументы, каждый по-своему.
    var o_1 = {
    	name: 'Peter',
    	hello: function () {
    		console.log('Hello, ' + this.name);
    	},
            sum: function (a, b) {
    		console.log(`${this.name} sum a and b to ${a + b}`);
    	}
    };
    
    var o_2 = {
    	name: 'Jane'
    };
    
    o_1.sum.call(o_2, 2, 4);
    o_1.sum.apply(o_2, [1, 2]);


    Отличие между этими двумя методами в том, как они принимают аргументы, которые попадут в функцию.
    call принимает список аргументов, начиная со второго, а apply, соответственно, принимает массив.

    Также, ничто не мешает вам вызвать функцию, которая не нуждается в контексте, для этого первым аргументом можно передать null.

    var o = {
    	sum: function (a, b) {
    		console.log(a + b);
    	}
    }
    o.sum.call(null, 1, 2);
    o.sum.apply(null, [1, 2]);


    Подробнее тут.

    6. bind тоже довольно простая штука. Отчасти он похож на предыдущие два метода, за исключением того, что он не вызывает функцию сразу же.
    Основная его задача - вернуть функцию, которая будет вызвана для нужного вам контекста.

    var o = {
    	a: 1,
    	b: 2,
    	sum: function () {
    		console.log(this.a + this.b);
    	}
    };
    
    var o2 = {
    	a: 10,
    	b: 20
    };
    
    var o2Sum = o.sum.bind(o2);
    
    o2Sum();


    Также с помощью bind можно каррировать функции.
    Всё есть здесь

    PS: надеюсь, код не содержит ошибок и я нигде не налажал и всё правильно рассказал.
    Ответ написан
    4 комментария
  • Где используются прототипы, наследование в JS приложениях?

    kulakoff
    @kulakoff
    Vue.js developing
    Если вы пользуетесь фреймворками, то они как правило, уже предлагают способы разбиения и инкапсулирования кода в модули, компоненты, диктуют принципы взаимодействия, наследования и т.д. И знание этих слов и их применение вам может понадобится не так часто) Но если вы захотите написать свой фреймворк или библиотеку, то без них вам не обойтись. Вообще это базовые конструкции js, не удивительно, что про них спрашивают)
    Ответ написан
    2 комментария
  • С чего лучше начать изучение стека MEAN?

    @bagzon
    Backend PHP, NodeJs, JS
    Чёткий план:
    1) Поднять стек MEAN на локалке, а лучше на VB (Virtual box) чтобы не засрать машину
    2) Взять Angular 2 и закатать чат с помощью сокетов
    3) На ноде логировать с помощью какой нибудь библы ошибки,и еще что нибудь в файл
    4) Сделать админку со статистикой с помощью графиков, брав контент и делая подсчеты с MongoDB

    По итогу ты познаешь сокеты, нормальное логирование, графики, как строятся SPA приложухи + роутинг
    Ответ написан
    2 комментария
  • PUT & POST при написании API

    charon
    @charon
    рекомендую вам не очень парится по поводу теории, а просто ограничиться POST и GET. В нашем проекте сделали всё по правилам, а потом выяснилось, что Флекс-код с другого сервера ни PUT, ни DELETE слать не может, пришлось делать проксирование.
    Ответ написан
    Комментировать
  • Как в angular сделать переход по ссылкам без смены параметров?

    severus256
    @severus256
    Code everywhere....
    передавать их дальше в url как параметры.
    Ответ написан
    Комментировать
  • Как можно сделать подобную шкалу?

    @kstyle
    в d3js можно сделать спокойно. только надо подучить scale(), enter(), append().
    Ответ написан
    1 комментарий
  • Как объединить два массива?

    werty1001
    @werty1001
    undefined
    let a = ['white', 'black'],
        b = ['red', 'green', 'black', 'white'];
    
    let array = a.concat( b.filter( val => a.indexOf( val ) < 0 ) );
    Ответ написан
    Комментировать
  • Как победить OPTIONS при CORS?

    @davidnum95
    Касательно YII2 в базовом контроллере нужно указать поведение для CORS:
    public function behaviors()
        {
            return [
                'corsFilter' => [
                    'class' => Cors::className(),
                ],
                'authenticator' => [
                    'class' => HttpBearerAuth::className(),
                    'except' => ['options'],
                ],
            ];
        }
    Ответ написан
    Комментировать
  • Как победить OPTIONS при CORS?

    astec
    @astec
    Разработчик https://debtstracker.io/
    Только вчера разбирался для своего проекта по учёту долгов https://debtstracker.io/ и победил.

    На OPTIONS надо возвращать 200 с заголовками и пустой ответ.

    Я руководствовался этой схемой:
    cors_server_flowchart.png

    Вот мой работающий код на Go:

    func getOnly(handler HttpHandler) HttpHandler {
    	return func(w http.ResponseWriter, r *http.Request) {
    		c := appengine.NewContext(r)
    		if r.Method == "OPTIONS" {  // Preflight request
    			origin := r.Header.Get("Origin")
    			switch origin {
    			case "http://localhost:8080":
    			case "http://localhost:8100":
    			case "https://debtstracker.local":
    			case "https://debtstracker.io":
    			case "":
    				BadRequest(c, w, errors.New("Missing required request header: Origin"))
    				return
    			default:
    				err := errors.New(fmt.Sprintf("Unknown origin: %v", origin))
    				log.Debugf(c, err.Error())
    				BadRequest(c, w, err)
    				return
    			}
    			log.Debugf(c, "Request 'Origin' header: %v", origin)
    			if accessControlRequestMethod := r.Header.Get("Access-Control-Request-Method"); accessControlRequestMethod != "GET" {
    				BadRequest(c, w, errors.New("Not a valid preflight request"))
    				return
    			}
    			responseHeader := w.Header()
    			responseHeader.Set("Access-Control-Allow-Methods", "GET")
    			if accessControlRequestHeaders := r.Header.Get("Access-Control-Request-Headers"); accessControlRequestHeaders != "" {
    				log.Debugf(c, "Request Access-Control-Request-Headers: %v", accessControlRequestHeaders)
    				responseHeader.Set("Access-Control-Allow-Headers", accessControlRequestHeaders)
    			} else {
    				log.Debugf(c, "Request header 'Access-Control-Allow-Headers' is empty or missing")
    				// TODO(security): Is it wrong to return 200 in this case?
    			}
    			responseHeader.Set("Access-Control-Allow-Origin", origin)
    			w.WriteHeader(200)
    			return
    		}
    		if r.Method != "GET" {
    			BadRequest(c, w, errors.New(fmt.Sprintf("Expecting to get request method GET, got: %v", r.Method)))
    			return
    		}
    		handler(w, r)
    	}
    }
    Ответ написан
    1 комментарий
  • Как лучше организовать структуру папок для большого приложения (в частности сервисов)?

    @Memfisrain
    Мне нравится подход при котором приложение структурируется по фичам. Я бы добавил к вашей архитектуре app/common, где будут храниться общие для компонентов сервисы, директивы и т.д в папках с такими же именами(services, directives)
    Ответ написан
    Комментировать
  • Стоит ли и зачем использовать PHP на фронте, где есть Angular?

    dmnBrest
    @dmnBrest
    Salesforce for money. Python, Go, Ruby for soul.
    По рукам этим PHP-никам. Они просто одеяло на себя тянут. Если в проекте решили использовать Ангуляр, то это уже совсем другая архитектура и бэкендщикам надо перестраиваться - они уже должны писать чистые rest services и забыть про view, templates и прочую фигню которая превращается в html! ВООБЩЕ ПРО HTML пусть забудут. Если все же поступают задачи рендерить что-то на сервере - тогда нафиг не нужен ангуляр.
    Ответ написан
    Комментировать