Софтуерно Инженерство
Loading...
+ Нов въпрос
a.angelov avatar a.angelov 1331 Точки

Има го качено май още от петък в инстанцията на круса.

2
filip_popov avatar filip_popov 9 Точки

Имам молба към авторът на заданието, ако е възможно да качи едно кратко видео с разяснения по заданието. Аз лично имам два въпроса.

„Use PHP7’s strict types (both return types and argument types)  and declare strict_types=1 everywhere in your framework and controller actions

Трябва ли да ползваме някакви новости от PHP7, или само трябва да ползваме нея версия, и като цяло тези strict types нищо не ми говорят (нещо като в C# и Java)?

Each student will have to deliver a public defense of its work in front of the SoftUni team.

Това означава ли че няма да има онлайн защита?

Ако има такова качено видео с разяснения, се извинявам, и ако може един линк към него.

2
Buberun avatar Buberun 0 Точки

В тая връзка на мен ми е интересно да попитам кое IDE поддържа PHP7 или да си ползваме notepad. Може би, защото до момента имаме само RC на PHP никой не пуска още официална поддръжка с изключение на PHPStorm, който е платен. Може би след година да е достъпно да се правят проекти на PHP7, но към момента това е неоправдано и заданието е много трудно изпълнимо. Може би е добре и някой от оценяващите да покаже написан от него такъв проект за да ме убеди, че е постижимо написването му в срок от 20 дена. Това е личното ми мнение, което макар и критично е с цел да подпомогне преподавателския процес в СофтУни.

0
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

PHPStorm има 30 дни trial. Също така би трябвало да сте получили от СофтУни ключове за IDE-то. Дори и да няма full-support, има 90% съпорт, а това което се иска от вас - стриктното типизиране, се поддържа в PHPStorm.

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Забавно... хем да ползваме PHP7, хем да го качим live in Internet. И естествено повечето хостинг компании все още са далеч от това да предлагат PHP7 поддръжка... Примерно аз имам платен абонамент в superhosting, където обаче най-новата версия, с която може да работи е 5.6.

Другото странно нещо е да пишем проекта на версия, която все още няма final release и не се знае до каква степен са изчистени бъговете. Да, вярно че не създаваме код, който ще го пуснем в production, но все пак...

Иначе повече подробности за миграцията от 5.6 на 7.0 може да се видят тук

5
09/11/2015 10:48:41
mar0der avatar mar0der 191 Точки

аз имам хостинг със пхп7 ако не намериш ми пиши

1
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Здравейте,

За РНР Версия 7 трябва да ползвате от нея само стриктното типизиране с директивата strict_types=1 и всеки метод от фреймуърка ви да е направен да приема типове и да връща такива (освен ако не е void, тогава не връща разбира се), примерно:

public function createController(string $controllerName) : ControllerAbstract
{

    $instanceName = "\Controllers\\$controllerName";

    return new $instanceName();

}

Този фийчър е напълно одобрен и със сигурност ще бъде релийзнат в стейбъл версията, за хората които се притесняват от това. Както сами се сетихте, това е много подобно и на другите езици, които сте учили (C# и Java).

За качването в интернет - да, така е, някои хостинг компании, особено в България, все още не поддържат РНР 7. Разбира се, има такива, които поддържат (SiteGround мисля са едни от тях). С по-усърдно търсене в интернет може и да намерите сносен безплатен хостинг, който го поддържа и не лепи много реклами по сайта. Аз лично бих предложил да си направите някъде trial акаунт, където се предлагат виртуалки, например Microsoft Azure. Вдигате виртуалка и инсталвате РНР7 и там и рънвате сайта на тази виртуалка :)

Относно защитите, ще има и онлайн защити. Пак е публична защитата и пак ви чуват и останалите, само че се случва през скайп :)

Насреща съм да давам и още разяснения по проекта, ако има още неясни неща.

Поздрави,

Иван

3
ph.kolarov avatar ph.kolarov 63 Точки

Ще съм ти благодарен ако разясниш проекта както го направи за предходния в една тема. Беше доста точно и страшно помогна.

2
StrahilRuychev avatar StrahilRuychev 117 Точки

Един въпрос и от мен относно заданието - разрешава ли се ползването на ORM фреймуърци от рода на Eloquent например?

1
verito898 avatar verito898 SoftUni Team 290 Точки

Не е много по темата , но за да не отварям нова - някой успя ли да подкара php 7 през xampp-a ?

0
a.angelov avatar a.angelov 1331 Точки

Аз не съм се опитвал през XAMPP, а си свалих и инсталирах Bitnami stack-а от тук: https://bitnami.com/stack/wamp/installer

Подобно е на XAMPP, интсталираш го в друга папка и имаш там PHP7, Apache и MySql.

Това препоръчват в сайта на XAMPP за PHP7.

4
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Анатоли, забелязвал ли си при теб бавна работа на приложението ти? При мен установих, че PDO връзката с базата изключително много ми забавя приложението. Говорим дори само за инстанцирането на PDO, без дори да се правят заявки към базата. При всяко презареждане трябваше да чакам по 2-3 секунди преди да ми зареди страницата. След като следвах инструкциите на Royal с малко модификации от моя страна настроих Php7 за Xampp и абсолютно същия код вече лети и страниците се зареждат мигновено. 

Ако и при теб bitnami-то работи толкова бавно то определено трябва да се избяхва.

0
24/11/2015 16:03:20
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Ето малко по-подробни разяснения по проекта, ще обърна вимание само на нещата, които не съм разяснявал вече:

1. Identity system. Тук идеята е, че фреймуъркът, като stand-alone app, пускайки за пръв път проект върху него, да създава някакъв релационен модел в базата данни, с която е настроен да работи, който да бъде отговорен за User-ите.

Най-добре би било да взима информацията от някакъв клас. Например IdentityUser, който фреймъркът е дефинирал и има съответните пропъртита и действия. Отделно във фреймуърка би трябвало да има контролери отговорни за логина, логаута и регистрацията, вързани по начало за IdentityUser

Впоследствие, ако реши някой (вие) да екстендва функционалността на потребителя, като например иска той да има и телефонен номер, прави допълнителен клас, например ApplicationUser, който наследява IdentityUser. Добавя в списъкът с книги. Казва от някаква конфигурация, че конкретиката, която ще се ползва от тук нататък в апп-а за потребителите е ApplicationUser. Това при first-run на app-а добавя колона за телефон на потребителя.

В този смисъл отговарям и на въпроса дали може да се ползва ORM. За тази функционалност около потребителите не е позволено. За останалите неща, които не са вързани с потребителите, ако искате интегрирайте готов ORM. Но така ще имате един mini-ORM, който вие сте накодили и обслужва логиката около потребителите и техния релационен модел и втори ORM, който сте свалили от някъде и обслужва останалата част от домейна.

2. HttpContext. Това би трябвало да е някакъв обект, който се инджектва на контролерите при инстанцирането им и се напълва със състоянието на съответния мрежови request/response. Т.е. знае за кукита, сесии, кой е логнатия юзър и дали въобще има такъв (инстанция на съответния клас от т. 1), какво се е напълнило в пост рикуеста и какво в гет рикуеста.

class HttpContext
{
    public function getRequest() : HttpRequest
    {
         return $this->request;
    }

    public function getCookies() : HttpCookie
    {
         return $this->cookie;
    }
}

От там всичките рикуести, кукита, сесии и т.н. са някакви обекти, които вътре в себе си при завъртането на MVC lifecycle-а се напълват с това, което се е случило през текущата сесия. Предполагам се сещате, че ако това искате да го Mock-нете, пишейки тестове, няма да се завърти MVC Lifecycle-а и всичките рикуести, кукита и контексти ще са празни и ще трябва ръчно да ги напълните. Т.е. трябва да има някакъв вариант отвън ако някой създава HttpContext-а и неговите зависимости да може да го напълни с параметри, ако е нужно.

Достъпът до сесии, кукита етц си го представям като от съответния обект се извика ключа на кукито/сесията и върху него се изпълни някакво действие (помислете това как е възможно, РНР позволява такъв модел)

Например в контролера

$this->getHttpContext()->getCookie()->language->delete();

Би трябвало да изтрие кукито language ($_COOKIE['language']). А например

$this->getHttpContext()->getCookie()->language = "english";

Би трябвало, ако няма куки language да го създаде със стойност english. А ако има такова, да му сложи стойността english.

От друга страна контролерът не би трябвало да може да променя това което съществува в $_GET/$_POST. Т.е. там нещата трябва да са рийд онли. Можеш да достъпиш $this->getHttpContext()->getRequest()->getForm()->topicBody ($_POST['topicBody']), но не можеш да го променяш

На подобен принцип би трябвало да връща и информация за логнатия юзър e.g. $this->getHttpContext()->getIdentity();

3. Annotation Parser. Общо взето някакъв скенер за анотации. Преглежда анотациите на методите/класовете и се опитва от тях да вдигне клас с името на анотацията и да му изпълни тригерите, които са му закачени. Ако не съществува такъв клас, значи някой е използвал грешната анотация - Exception.

@Route("home/edituser")
public function edit(UserBindingModel $model) : ViewResult
{
    // ...
}

Парсерът се опитва да вдигне new RouteAnnotation("home/edituser"); След което му извиква някакви тригери, например метод, който се вика преди каквото и друго да се изпълни e.g. beforeActionExecute(); в който да речем има логиката около рутирането или каквото там прави анотацията. Може да е валидираща анотация на параметрите, тогава може би трябва друг метод да се изпълни в по-късен етап, когато имаме налични параметри и т.н.например onActionExecuting();

Тук пак може да подходите, както говорихме преди време в часовете, да се сканират на някакъв интервал анотациите и покрай техния ефект да се изгради някакъв конфиг, който е по-бърз за четене от колкото всеки път да се минава през всички анотации. Въпросът е, че този път ще трябва да се обслужи логиката в тригерите на анотациите и може да стане малко по-сложно що се отнася до това, че после може да дойде Пешо да измисли анотацията @FokItAll да и набие някакъв код тригерите и да я сложи на два метода отгоре т.е. незнаете какви видове анотации ще се появята във времето :) Помислете как бихте могли да се справите с този случай.

 

Предполагам, че отдавна сами сте се сетили, че в този фреймуърк, който пишем не откриваме топлата вода и че това са неща, които вече хората са ги измислили и ги ползват. Тези трите неща специално съществуват под някаква форма в ASP.NET MVC и може би сте ги виждали вече там.

Разяснения относно Conference Scheduler-а трябват ли?

Трики партс там са Must visit функционалността и Maximum lectures. Изискват малко повечко да се помисли логически над проекта.

Хубаво е да къмитвате всяка промяна или новост, която направите. Ако само последните 3 дни сте работили си е лек признак за лоша организация и респективно качество.

Успех!

4
filip_popov avatar filip_popov 9 Точки

Здравей,

Може ли малко разяснения по „Conference Scheduler“. Нещо като календар за лекции ли трябва да бъде? Ако може някакъв линк за подобно приложение, за да придобия по ясна представа какво се иска от мен. Предполагам, че и на други колеги ще им бъде полезно.

Имам още един проблем свързан с “strict_types = 1”. Когато подавам null на променлива от тип инт и дори стринг, ми гърми приложението. Пример:

Така работи и при null.

public function filterById($id){     }

Така не работи при null.

public function filterById(int $id){     }

Та въпроса ми е, има ли нещо в php както в C#(int? id)? И declare(strict_types=1) само в index.php ли трябва да го декларирам?

2
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Трябва да бъде системка, в която хората създават конференции, вкарват зали и лекции в тези зали и техен времеви диапазон с лектори и т.н. Други хора пък искат да посещават тези лекции, избират си лекции за посещаване, системката има есествени ограничения от сорта на не можеш да посетиш лекцията Х която е от 13:45 до 14:30, понеже си маркирал че ще посещаваш лекцията от 13:20 до 14:10 и съответно двете колайдват в диапазона 13:45 - 14:10. Разбира се са описани и още функционалности, като Най-много лекции, които мога да посетя и т.н. :)

Що се отнася до NULL нещата - малко е кофти със стриктното типизиране наистина. Може да погледнеш Null Object Pattern

3
dinkoslav avatar dinkoslav 125 Точки

Привет,

Всичко е много "хубаво", но все още се питам защо нивото на трудност за точно този проект беше вдигнато толкова много. Не се е наблягало на PHP през цялото обучение в СофтУни (PHP Basics не мисля, че трябва да го споменавам). Вместо по-сложен проект като този да се даде на ASP.NET или на JS, където предимно сме наблягали, то тои се дава на РНР. Нямам нищо против езика, но е малко трудно да се прехвърляме от език на език за толкова кратко време. И след като проектите за първата дата бяха ограничен брой точно поради тези причини, защо ми се струва, че поправката е все едно като повишителен изпит. Цялото това нещо което трябва да се направи явно трябва да наподобява ASP.NET с вграден EF + куп други неща, които са задължителни. Ако идеята на проекта е да откажеш колкото се може повече хора от него, е успяваш определено. А до колкото виждам дори не направи показно как да стартираме цялото това нещо (както беше направено в предния курс, но това, което правеха ми се струва прекалено аматьорско в сравнение с това, което сега трябва да направим).

Успех,

Динко

21
filip_popov avatar filip_popov 9 Точки

Някой намерил ли е безплатен хостинг за php7? Ако да, къде?  

2
yuletodim avatar yuletodim 37 Точки

Здравей!

Ето какво намерих аз:

http://host.bg/bg/hosting/host1?utm_source=adwords&utm_medium=cpc&utm_campaign=cpc_newp_srch&gclid=CO7ggeH0rckCFaXnwgod-rELsA

Може да си купиши и само за 1 мес. срещу 5лв. Иначе най-евтиния е 2,75лв./мес.

Успех!

1
filip_popov avatar filip_popov 9 Точки

Здравейте,

Имам проблем с хостинга, досега съм качвал само едно сайтче на друпал а там се случват доста по- лесно нещата. Това което съм направил до сега: От MySql Databases си направих база и юзър и дадох пълни права на юзъра, от phpMyAdmin си импортнах sql скрипта, мина всичко нормално, там са всички таблици с информацията. После в  public_html хвърлих всички файлове от проекта си и смених версията на php-то вече не ми дава warning за strict_type. Но ми дава това:


Warning: require_once(/Core/Database.php): failed to open stream: No such file or directory in /home/filipp18/public_html/Autoloader.php on line 14

На локалхоста всичко работи, за основа на проекта си ползвам лаба от инстанцията на курса. Смених и тези настройки но пак ми дава същата грешка. A файла си е там.

const DB_DRIVER = 'mysql';
const DB_HOST = 'localhost';
const DB_USER = 'root';
const DB_PASS = '123456';
const DB_NAME = 'application';
const DB_INSTANCE = 'app';
0
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Аз до колкото разбирам грешката, няма нищо общо с базата данни. Не успява да отвори файла Database.php. Разгледай какви са include_path-овете на сървъра? Дали я има точката (текущата директория, където е индекс.пхп) в тях. Защото би трябвало, ако я има - да работи - текущат директория / Core / Database.php ако там се намира файла, то трябва да се отвори.

Подозирам, че взима за текуща директория /var/www вместо /var/www/public_html - ако е така или направи аутолоудера да префикса с пъблик-хтмл или със set_include_path сложи папката.

1
26/11/2015 13:23:31
filip_popov avatar filip_popov 9 Точки

Пробвах така да го направя:

class Autoloader{
    public static function init(){
	spl_autoload_register(function(string $class) {
    		define("APPLICATION_PATH",realpath(''));
    		define("CURRENT_PATH", getcwd());
    		$paths = array(APPLICATION_PATH,CURRENT_PATH);
		set_include_path(implode($paths, PATH_SEPARATOR));
                var_dump(get_include_path());
                $pathParams = explode("\\", $class);
	        $path = implode(DIRECTORY_SEPARATOR, $pathParams);
	        $path = str_replace($pathParams[0], "", $path);
	        require_once $path . '.php';
});
Пробвах само с :
set_include_path("/home/filipp18/public_html " );
Като var_dump-на горното ми дава:

string(26) "/home/filipp18/public_html" 
Warning: require_once(/Core/Database.php): failed to open stream: No such file or directory in /home/filipp18/public_html/Autoloader.php on line 17

Ако можеш да ми дадеш още малко насоки и разяснения, ще съм благодарен.

0
filip_popov avatar filip_popov 9 Точки

Намерих решение на горния проблем. По този начин autoloader.php при мен сработи.

public static function init(){

        spl_autoload_register(function($class) {

        $pathParams = explode("\\", $class);

        $path = implode('/', $pathParams);

        $path = str_replace("MVC/", "", $path);

        require_once $path . '.php'; });

 }

Предполагам, че проблема е бил в DIRECTORY_SEPARATOR. Но сега имам друг проблем:

Fatal error: Uncaught PDOException: SQLSTATE[28000] [1045] Access denied for user

Предполагам, че проблема е тук:

const DB_DRIVER = 'mysql';

const DB_HOST = 'filippopov.eu';

const DB_USER = '';

const DB_PASS = '';

const DB_NAME = 'filipp18_application';

const DB_INSTANCE = 'app';

Не знам на DB_USER и DB_PASS какво да сетна. А и на DB_HOST не съм много сигурен, че е така.

0