Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα σε όλους τους φίλους insomniacs developers!

Προσπαθώ να χρησιμοποιήσω μια 3rd party library σε ένα απλό php app αλλά μου βγάζει συνέχεια αυτό το error :

Fatal error: Uncaught Error: Class 'Doctrine\Common\Collections\ArrayCollection' not found in /Users/administrator/Sites/PizzaProject/add.php:46 Stack trace: #0 {main} thrown in /Users/administrator/Sites/PizzaProject/add.php on line 46

Εδώ είναι ο κώδικας.

<?php
	use Doctrine\Common\Collections\ArrayCollection;

	//initialize 3 variables to the empty string
	$title = $email = $ingredients = '';
	$errors = array('email' => '', 'title' => '', 'ingredients' => '');

	//check if the form was submitted
	if(isset($_POST['submit'])){
		//echo htmlspecialchars($_POST['email']);
		//echo htmlspecialchars($_POST['title']);
		//echo htmlspecialchars($_POST['ingredients']);

		//check email
		if (empty($_POST['email'])){
			$errors['email'] = 'An email is required <br>';
		} else {
			//echo htmlspecialchars($_POST['email']);
			$email = $_POST['email'];
			if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
				$errors['email'] = 'email must be a valid email address';
			}
		}

		//check title
		if (empty($_POST['title'])){
			$errors['title'] = 'A title is required <br>';
		} else {
			$title = $_POST['title'];
			if(!preg_match('/^[a-zA-Z\s]+$/', $title)){
				$errors['title'] = 'Title must be letters and spaces only';
			}
		}

		//check ingredients
		if (empty($_POST['ingredients'])){
			$errors['ingredients'] = 'At least one ingredient is required <br>';
		} else {
			$ingredients = $_POST['ingredients'];
			if(!preg_match('/^([a-zA-Z\s]+)(,\s*[a-zA-Z\s]*)*$/', $ingredients)){
				$errors['ingredients'] = 'Ingredients must be a comma separated list';
			}
		}

		//use doctrine collection library
		$collectionErrors = new ArrayCollection($errors);
		//$collectionErrors = new ArrayCollection([1, 2, 3]);
		//if the ArrayCollection of errors is not empty
		if(!$collectionErrors->isEmpty()){
			echo 'errors in the form';
		} else {	//if the ArrayCollection of errors is empty
			echo 'form is valid';
		}


	}//end of POST check

?>

<!doctype html>
<html lang="en">

	<?php include('templates/header.php'); ?>

		<section class="container grey-text">
			<h4 class="center">Add a Pizza</h4>
			<form action="add.php" class="white" method="POST">
				<label>Your Email:</label>
				<input type="text" name="email" value="<?php echo htmlspecialchars($email) ?>">
					<div class="red-text"><?php echo $errors['email']; ?></div>
				<label>Pizza Title:</label>
				<input type="text" name="title" value="<?php echo htmlspecialchars($title) ?>">
					<div class="red-text"><?php echo $errors['title']; ?></div>
				<label>Ingredients (comma separated):</label>
				<input type="text" name="ingredients" value="<?php echo htmlspecialchars($ingredients) ?>">
					<div class="red-text"><?php echo $errors['ingredients']; ?></div>
				<div class="center">
					<input type="submit" name="submit" value="submit" class="btn brand z-depth-0">
				</div>
			</form>
		</section>

	<?php include('templates/footer.php'); ?>


</html>

Αν δείτε στα comments προσπάθησα μέχρι και να βάλω μια array χειροκίνητα μήπως είχε πρόβλημα με την array που έρχονταν σαν variable αλλά και πάλι το ίδιο ακριβώς λάθος μου έβγαζε.

Επεξ/σία από skiabox
Δημοσ.

Το λάθος δεν έχει να κάνει με τον κώδικα, απλά δεν μπορεί να φορτώσει την βιβλιοθήκη. Ίσως είναι λάθος το namespace

Δημοσ.
1 ώρα πριν, k33theod είπε

Το λάθος δεν έχει να κάνει με τον κώδικα, απλά δεν μπορεί να φορτώσει την βιβλιοθήκη. Ίσως είναι λάθος το namespace

Ευχαριστώ για την γρήγορη απάντηση.

Πως μπορώ να τσεκάρω ποιο είναι το σωστό namespace;

Τελικά βρήκα λύση.

Επρεπε να προσθέσω την παρακάτω γραμμή στην κορυφή του αρχείου :

require_once './vendor/autoload.php';

 

Δημοσ.
2 ώρες πριν, skiabox είπε

Ευχαριστώ για την γρήγορη απάντηση.

Πως μπορώ να τσεκάρω ποιο είναι το σωστό namespace;

Τελικά βρήκα λύση.

Επρεπε να προσθέσω την παρακάτω γραμμή στην κορυφή του αρχείου :


require_once './vendor/autoload.php';

Ναί αυτό είναι μία λύση. Άλλη λύση είναι να χρησιμοποιήσεις ένα πρόγραμμα λέγεται composer και είναι depedency manager αυτό σου κάνει autoload όλα τα depedencies .

https://getcomposer.org/

Για μεγάλα project θα το χρειαστείς για να μην γραφεις require include 40 φορές

Δημοσ.

Μα τον χρησιμοποιώ ήδη τον composer.Με τον composer εγκατεστησα την βιβλιοθήκη αυτή.

Δημοσ.
2 ώρες πριν, skiabox είπε

Μα τον χρησιμοποιώ ήδη τον composer.Με τον composer εγκατεστησα την βιβλιοθήκη αυτή.

Σωστά, δεν πρόσεξα το περιεχόμενο του require🙄 που έγραψες.  Ένα άλλο tip μάλλον θα το ξέρεις, το namespace μπορείς να το κάνεις alias με as px

use Doctrine\Common\Collections\ArrayCollection as DocAC;  για να αποφύγεις μεγάλα ονόματα

 

 

 

Δημοσ.

Πάντως και άλλους php developers που ρώτησα δεν μπόρεσαν να βρουν το λάθος.

Την υπόδειξη μου την έκανε ο ίδιος ο author της doctrine library.

Συνεπώς αναρωτιέμαι μήπως έκανα κάποιο λάθος στο workflow.

Υπάρχει δηλαδή και άλλος τρόπος να χρησιμοποιήσεις μια library σε ένα project;

Δημοσ. (επεξεργασμένο)

Δεν έχει να κάνει με τον ventor σε αυτή την περίπτωση δηλαδή το doctrine. Είναι χαρακτηριστικό του composer. Ανεξάρτητα από τον ventor δηλαδή (ventor είναι η πρώτη λέξη στην library) πάντα το ίδιο κάνεις και αρκεί ενα include για όλα τα depentencies. To tutorial του composer https://getcomposer.org/doc/01-basic-usage.md το έχει έτσι

require __DIR__ . '/vendor/autoload.php';

Ο άλλος τρόπος είναι ο κλασσικός include ή require το αρχείο που έχει μεσα την class. Αν θεωρήσουμε δηλαδή ότι το doctrine ακολουθεί την standar διαδικασία και οι κατάλογοι των namespaces υλοποιούνται και στο filesystem γράφεις require 'Doctrine\Common\Collections\ArrayCollection.php';

Άλλος τρόπος είναι με συναρτήσεις της standar library spl

 

Επεξ/σία από k33theod
  • Thanks 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...